flutter GestureDetector和InkWell、InkResponse響應(yīng)區(qū)別

這里我不是來說他們?nèi)叩挠梅ǎ饕v講他們之間的響應(yīng)范圍區(qū)別。

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');
          },
        ),
      )
    );
  }

執(zhí)行如上代碼,點(diǎn)擊紅色區(qū)域控制臺輸出為

flutter: tap this container
flutter: tap this container

這一點(diǎn)都沒疑問。但是一旦我把紅色部分代碼注釋掉。結(jié)果卻令我差異
點(diǎn)擊毫無效果。

我們在對代碼進(jìn)行改造如下:

  @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');
          },
        ),
      )
    );
  }

點(diǎn)擊紅色區(qū)域依然有輸出,但是點(diǎn)擊magin區(qū)域沒有任何反應(yīng)。

我們再次做實驗,代碼如下改造。Container內(nèi)部添加一行文字。把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(
              '有內(nèi)容部分'
            ),
          ),
          onTap: (){
            print('tap this container');
          },
        ),
      )
    );
  }

如上代碼,點(diǎn)擊magin部分沒輸出,點(diǎn)擊文字或者Container區(qū)域都有輸出。
從這里我們感覺好像只要Container內(nèi)部只要有顏色或者child整個container都能觸發(fā)手勢;

其實不然。我們再次改造代碼如下:

 @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(
                  '有內(nèi)容部分'
                ),
              ],
            ),
          ),
          onTap: (){
            print('tap this container');
          },
        ),
      )
    );
  }

如上我們添加了一個布局組件Column.神奇的事情發(fā)生了。我們除了點(diǎn)擊文字會觸發(fā)手勢,其他所有地方都沒有效果...

\color{red}{這怎么回事。如何避免這個問題。}
\color{red}{我們可以給Container添加一個decration或者color就可以避免。}或者\color{red}{使用如果只是簡單的tap或者press時間我們可以使用InkWell或者InkResponse},它們不但有點(diǎn)擊水墨效果而且完全避免了上述問題。但是使用InkWell要注意他會把整個child都包裹,內(nèi)部的Container的margin部分也會觸發(fā)手勢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Flutter最近比較熱門,但是Flutter成體系的文章并不多,前期避免不了踩坑;我這篇文章主要介紹如何使用Fl...
    HitenDev閱讀 6,166評論 1 53
  • 轉(zhuǎn)自 Q吹個大氣球Q 本文主要介紹Flutter中非常常見的Container,列舉了一些實際例子介紹如何使用。 ...
    chilim閱讀 1,001評論 0 0
  • 16日上午,我和同事們一起觀摩了本學(xué)期的二年級同課異構(gòu)活動。 《場景歌》是二年級上冊識字單元的一篇課文,兒歌內(nèi)容貼...
    你是特別的人閱讀 452評論 0 0
  • 曹妃甸區(qū)第一實驗小學(xué) 四年級一班 張蕓歌 今天的品德課上,老師為我們講述了一個動人心弦的故事———汶川地震后的...
    張玉曼閱讀 410評論 0 0
  • 畢業(yè)典禮和藝術(shù)節(jié)一起進(jìn)行。沒有通知孩子們穿校服,卻也服裝統(tǒng)一。 生活需要儀式感 ,畢業(yè)典禮給孩子們的初中生活畫了一...
    微風(fēng)1991閱讀 206評論 0 6