美文网首页
flutter GestureDetector和InkWell、

flutter GestureDetector和InkWell、

作者: 吻_风 | 来源:发表于2020-03-12 11:28 被阅读0次

    这里我不是来说他们三者的用法,主要讲讲他们之间的响应范围区别。

    Widget build(BuildContext context) {
        print('rebuild goodslistScreen');
        return Scaffold(
          body:SafeArea(
            child: GestureDetector(
              child:Container(
                color: Colors.red,
                height: 200,
                width: 500,
              ),
              onTap: (){
                print('tap this container');
              },
            ),
          )
        );
      }
    

    执行如上代码,点击红色区域控制台输出为

    flutter: tap this container
    flutter: tap this container
    

    这一点都没疑问。但是一旦我把红色部分代码注释掉。结果却令我差异
    点击毫无效果。

    我们在对代码进行改造如下:

      @override
      Widget build(BuildContext context) {
        print('rebuild goodslistScreen');
        return Scaffold(
          body:SafeArea(
            child: GestureDetector(
              child:Container(
                margin: EdgeInsets.all(50),
                color: Colors.red,
                height: 200,
                width: 500,
              ),
              onTap: (){
                print('tap this container');
              },
            ),
          )
        );
      }
    

    点击红色区域依然有输出,但是点击magin区域没有任何反应。

    我们再次做实验,代码如下改造。Container内部添加一行文字。把Contianer的颜色去掉会怎样

    @override
      Widget build(BuildContext context) {
        print('rebuild goodslistScreen');
        return Scaffold(
          body:SafeArea(
            child: GestureDetector(
              child:Container(
                margin: EdgeInsets.all(50),
                //color: Colors.red,
                height: 200,
                width: 500,
                child: Text(
                  '有内容部分'
                ),
              ),
              onTap: (){
                print('tap this container');
              },
            ),
          )
        );
      }
    

    如上代码,点击magin部分没输出,点击文字或者Container区域都有输出。
    从这里我们感觉好像只要Container内部只要有颜色或者child整个container都能触发手势;

    其实不然。我们再次改造代码如下:

     @override
      Widget build(BuildContext context) {
        print('rebuild goodslistScreen');
        return Scaffold(
          body:SafeArea(
            child: GestureDetector(
              child:Container(
                margin: EdgeInsets.all(50),
                //color: Colors.red,
                height: 200,
                width: 500,
                child: Column(
                  children: <Widget>[
                    Text(
                      '有内容部分'
                    ),
                  ],
                ),
              ),
              onTap: (){
                print('tap this container');
              },
            ),
          )
        );
      }
    

    如上我们添加了一个布局组件Column.神奇的事情发生了。我们除了点击文字会触发手势,其他所有地方都没有效果...

    \color{red}{这怎么回事。如何避免这个问题。}
    \color{red}{我们可以给Container添加一个decration或者color就可以避免。}或者\color{red}{使用如果只是简单的tap或者press时间我们可以使用InkWell或者InkResponse},它们不但有点击水墨效果而且完全避免了上述问题。但是使用InkWell要注意他会把整个child都包裹,内部的Container的margin部分也会触发手势。

    相关文章

      网友评论

          本文标题:flutter GestureDetector和InkWell、

          本文链接:https://www.haomeiwen.com/subject/kauyjhtx.html