Flutter:如何使整行可点击

时间:2019-10-09 00:19:34

标签: flutter

如何使整个行在抖动中可点击?我将以下代码包装在“ GestureDetector”中。该行中的单个项目是可单击的,但小部件周围的空白不是。

if ((auth.isLoggedIn)) ...[
   GestureDetector(
     onTap: () {
        auth.signOut();
     },
     child: buildItem(
        Image.asset("assets/images/logoff.png",),
        "logout"
     ),
   ),
],

这是“ buildItem”方法

Widget buildItem(Widget icon, String title) {
    return Padding(
      padding: const EdgeInsets.only(left: 20, right: 15),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
          Container(
              child: Row(
            children: <Widget>[
              icon,
              SizedBox(width: 20.0),
              Text(
                title,
                style: TextStyle(
                  fontSize: 16.0,
                ),
              ),
            ],
          )),
          Icon(
            Icons.arrow_forward_ios,
            size: 20.0,
          ),
        ],
      ),
    );
  }

这是输出。该行中的每个项目(图标,文本和>)都响应轻击手势。但是,空白区域(例如,文本和“>”之间的空白)对点击不响应

如何使整行响应水龙头。

enter image description here

3 个答案:

答案 0 :(得分:4)

用InkWell替换GestureDetector效果很好

完整代码

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            InkWell(
              onTap: () {
                print("click");
              },
              child: buildItem(
                  Image.network("https://picsum.photos/250?image=9",),
                  "logout"
              ),
            ),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

Widget buildItem(Widget icon, String title) {
  return Padding(
      padding: const EdgeInsets.only(left: 20, right: 15),
      child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Container(
                child: Row(
                  children: <Widget>[
                    icon,
                    SizedBox(width: 20.0),
                    Text(
                      title,
                      style: TextStyle(
                        fontSize: 16.0,
                      ),
                    ),
                  ],
                )),
            Icon(
              Icons.arrow_forward_ios,
              size: 20.0,
            ),
          ],
      ),
  );
}

enter image description here

答案 1 :(得分:2)

  child: GestureDetector(
      behavior: HitTestBehavior.translucent,
      onTap: () {
      ///
      },

答案 2 :(得分:0)

  

行:mainAxisAlignment:MainAxisAlignment.spaceBetween

对于它们之间的空间,第一个和最后一个对象将粘在容器的边缘,同时在它们之间保留未使用的空空间(如果还有其他对象,它将均匀分布),如下面的屏幕快照所示:

enter image description here

要解决此问题,您只需要确保它们之间没有空白即可。

一种使用mainAxisSize的方法:在放置图标和文本的行中使用MainAxisSize.max和MainAxisAlignment.start。