美文网首页Flutter
Flutter中Text占用一整行可点击

Flutter中Text占用一整行可点击

作者: 混不吝丶 | 来源:发表于2021-07-06 16:25 被阅读0次

    前言

    在开发中常常需要设置一整行的text都可以点击,以响应用户的操作,如果只指定text所占用的空间大小可点击,那么点击区域会非常小

    在一个column内一个Text可点击,我们的代码如下

     Expanded(
                child: GestureDetector(
                  onTap: ()=> Navigator.pop(context),
                  child: Text(
                      "取消",
                      style: TextStyle(
                          color: Color.fromRGBO(142, 142, 147, 1),
                          fontSize: 15,
                          backgroundColor: Colors.red
                      ),
                    ),
                ),
              )
    

    通过上面的代码发现Text的点击区域只有Text所占用的大小,并非整行都可点击,我们思考后认为需要一个盒模型拉伸宽度,又写下如下代码

     Expanded(
                child: GestureDetector(
                  onTap: ()=> Navigator.pop(context),
                  child: Container(
                    color: Colors.greenAccent,
                    width: double.infinity,
                    alignment: Alignment.center,
                    child: Text(
                      "取消",
                      style: TextStyle(
                          color: Color.fromRGBO(142, 142, 147, 1),
                          fontSize: 15,
                          backgroundColor: Colors.red
                      ),
                    ),
                  ),
                ),
              )
    

    本以为以解决这个问题,运行后发现盒模型的宽度是屏幕的宽度了,但text的点击区域依然是Text占用的本身大小的区域,这是为什么呢,经过查找发现GestureDetector内的behavior在作祟,这个behavior默认为deferToChild,也就是响应子控件的大小,并非整个大小。
    调整后的代码

    Expanded(
                child: GestureDetector(
                  behavior: HitTestBehavior.opaque,
                  onTap: ()=> Navigator.pop(context),
                  child: Container(
                    color: Colors.greenAccent,
                    width: double.infinity,
                    alignment: Alignment.center,
                    child: Text(
                      "取消",
                      style: TextStyle(
                          color: Color.fromRGBO(142, 142, 147, 1),
                          fontSize: 15,
                          backgroundColor: Colors.red
                      ),
                    ),
                  ),
                ),
              )
    

    重点为behavior属性,设置opaque使整个container可响应点击
    附上源码

    /// How to behave during hit tests.  点击后的行为
    enum HitTestBehavior {
      /// Targets that defer to their children receive events within their bounds
      /// only if one of their children is hit by the hit test.
    
      deferToChild,   //只有一个子组件命中后响应
    
      /// Opaque targets can be hit by hit tests, causing them to both receive
      /// events within their bounds and prevent targets visually behind them from
      /// also receiving events.
      opaque,     // 事件在它的范围内都响应
    
      /// Translucent targets both receive events within their bounds and permit
      /// targets visually behind them to also receive events.
      translucent,  // 既可以在其范围内接收事件,也可以允许事件目标也接收事件
    }
    

    相关文章

      网友评论

        本文标题:Flutter中Text占用一整行可点击

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