如何使onTap仅响应实际文本而不是整个ListTile宽度

时间:2019-07-10 19:52:36

标签: flutter dart flutter-layout

插图

我有以下问题:

ListTile

即使在较小的区域中只有文本,ListTiletitlesubtitle组件也会完全展开。
通常,这不是问题,因为您可以将title的背景和ListTie涂上相同的颜色。

但是,尝试在onTapRow中的 title 上运行subtitle事件时遇到问题:

ListTile onTap

如您所见,我在Row组件中有一个title,其中有一个Icon和一个Text。效果很好,但是,尝试向此onTap添加title会产生不良行为。
希望onTap在我点击文本或图标时触发,而不是在我点击右侧其他地方时触发。我不知道如何将title的宽度限制为文本加图标的宽度。似乎没有任何效果。这是怎么回事?

代码

I created a Gist带有两个插图的源代码(最小可重现示例)。这应该有助于您了解设置过程。

仅在点击onTap的实际子级时,而不是无论我做什么,整个Row区域都不会扩展的情况下,我怎么才触发title

注释

我可能只向InkWellText分别添加一个Icon,但这根本不是我想要的,因为我想要一个飞溅({{1 }}的首字母缩写)将标题和图标一起覆盖,并且不应在视觉上将它们分开。

2 个答案:

答案 0 :(得分:2)

请尝试以下对我有用的代码

import 'package:flutter/material.dart';
main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: Center(
          child: Container(
            color: Colors.greenAccent,
            child: ListTile(
              dense: true,
              leading: Material(child: const Text('leading')),
              title: Material(
                child: Row(
                  children: <Widget>[
                    InkWell(
                      onTap: () {},
                      child: Row(
                        mainAxisSize: MainAxisSize.min,
                        children: <Widget>[
                          Icon(Icons.format_align_left),
                          Text(
                            'title',
                          ),
                        ],
                      ),
                    ),

                      Container(
                        height: 0.0,
                      ),

//                    Expanded(child: Container(
//                      height: 10.0,
//                    ),)
                  ],
                ),
              ),
              subtitle: Material(child: const Text('subtitle')),
              trailing: Material(child: const Text('trailing')),
            ),
          ),
        ),
      ),
    ),
  );
}

答案 1 :(得分:1)

使用FlatButton.icon而不是InkWellRow

FlatButton.icon解决了您提到的问题,并具有产生飞溅效果和带有图标标题的目的。它也减少了您的代码。参见下面的示例

title: Align(
     alignment: Alignment.centerLeft,
     heightFactor: 1.0,
     child: FlatButton.icon(
         splashColor: Colors.white,
         onPressed: () {},
         icon: Icon(Icons.format_align_left),
         label: Text('title'))),

完整代码

main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: Center(
          child: Container(
            color: Colors.greenAccent,
            child: ListTile(
              dense: true,
              leading: Material(child: const Text('leading')),
              title: Material(
                child: Align(
                    alignment: Alignment.centerLeft,
                    heightFactor: 1.0,
                    child: FlatButton.icon(
                        splashColor: Colors.white,
                        onPressed: () {},
                        icon: Icon(Icons.format_align_left),
                        label: Text('title'))),
              ),
              subtitle: Material(child: const Text('subtitle')),
              trailing: Material(child: const Text('trailing')),
            ),
          ),
        ),
      ),
    ),
  );
}