【问题标题】:Remove padding from ListTile between leading and title从 ListTile 中删除前导和标题之间的填充
【发布时间】:2019-01-11 21:15:09
【问题描述】:

我需要删除 ListTile 中前导 Widget 和标题 Widget 之间的一些填充。 它有太多的空格。 有没有办法做到这一点? 我使用的代码是这样的:

ListTile _getActionMenu(String text, IconData icon, Function() onTap) {
  return new ListTile(
    leading: new Icon(icon),
    title: new Text(text),
    onTap: onTap,
  );
}

【问题讨论】:

标签: dart flutter


【解决方案1】:

您可以在 ListTile 上使用 minLeadingWidth。 默认值为 40,因此您可以使用较低的值来使您的前导和标题更接近。

ListTile(
  leading : Icon(Icons.settings),
  title : Text("Settings"),
  minLeadingWidth : 10,
);

【讨论】:

  • 哇,我很高兴滚动到本页底部找到这个答案!
  • 这在稳定频道时会很棒。截至 2021 年 3 月 2 日,它在开发频道中。 edited file's GitHub branch tag1.27.0-8.0.pre(稳定版是currently at 1.22.6)。
  • 一天后flutter upgrade just upgraded to 2.0.0。如果我没看错,这似乎包括所有开发(和测试版)频道更改(开发现在有一个更新的2.1.0-10.0.pre 构建)。我仍在稳定频道上,此选项 minLeadingWidth 现在可用
  • 由于某种原因它在弹出菜单中不起作用,反映的是增量而不是减量
【解决方案2】:

编辑:Flutter 2.0 升级后

正如 Dinesh 指出的 hereListTile 已收到 minLeadingWidth 属性。

默认值为40,所以要通过x减少前导和标题之间的空间@通过minLeadingWidth: 40 - x


Align 结果将取决于文本和图块宽度。

使用Transform.translate 以获得一致的结果。

ListTile(
  leading: Icon(icon),
  title: Transform.translate(
    offset: Offset(-16, 0),
    child: Text('Some text'),
  ),
);

【讨论】:

  • @westdabestdb 答案对我有用,但仅适用于标题。对于字幕只有这个有效。
  • 完美运行!
  • minLeadingWidth 是更好的方法
【解决方案3】:

对于那些现在正在寻找一个干净的单行答案的人。你可以使用

ListTile(
 horizontalTitleGap: desiredDoubleValue,
);

【讨论】:

    【解决方案4】:

    此代码是解决方案

    ...
        contentPadding:EdgeInsets.all(0),
    ...
    

    【讨论】:

    • 这仅减少了前导小部件的左边距
    • 谢谢!为我工作
    【解决方案5】:

    使用horizo​​ntalTileGap:

    ListTile(
            horizontalTitleGap: 0,
            leading: CircleAvatar(
              radius: 50,
              backgroundImage:
                  NetworkImage("https://picsum.photos/250?image=1"),
            ),
            title: Text("Image 6"),
          ),
    

    【讨论】:

      【解决方案6】:

      将 Horizo​​ntalTitleGap 设置为 0

       ListTile(
                                contentPadding: EdgeInsets.zero,
                                minLeadingWidth: 5,
                                ***horizontalTitleGap: 0,***
                                leading: widget,
                                title: widget ,
                               )
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案7】:

      只需添加:contentPadding: EdgeInsets.zero,即可解决

      【讨论】:

        【解决方案8】:

        您可以使用Align 并指定Alignment

        ListTile _getActionMenu(String text, IconData icon, Function() onTap) {
          return new ListTile(
            leading: new Icon(icon),
            title: Align(
              child: new Text(text),
              alignment: Alignment(-1.2, 0),
            ),
            onTap: onTap,
          );
        }
        

        【讨论】:

        • 标题不对称
        • 您的解决方案有效,但如果我将文本放入容器中则无效。我把它放在一个容器中,因为我想设置背景颜色,但是 Align 停止做任何事情。请问有人知道解决方法吗?
        • 如果列表图块的实现发生变化,这将导致问题。 (例如,列表图块中的默认填充更改)更好的方法是不使用前导并使用行小部件将所需的前导小部件添加为标题的一部分。显示在此处的其他答案中。
        • Rustem Kakimov 下面的答案是最好的替代选择。
        【解决方案9】:

        我发现的一个 解决方法是在标题部分放置一个 Row 小部件,然后将图标和文本放在该 Row 中,中间有一个 SizedBox。这样您就可以控制它们之间需要多少空间:

        ListView(
          shrinkWrap: true,
          children: <Widget>[
            ListTile(
              title: Row(
                children: <Widget>[
                  Icon(Icons.android),
                  SizedBox(
                    width: 5, // here put the desired space between the icon and the text
                  ),
                  Text("Title") // here we could use a column widget if we want to add a subtitle
                ],
              ),
            )
          ],
        )
        

        【讨论】:

        • 这并不难看,比 IMO 接受的答案要少。至少您可以精确控制填充,并且它不依赖于设备纵横比。
        • 我是新手,但我同意@ncuillery - 这是一个很好的解决方案。谢谢!
        • 我不能 100% 确定,但我相信在 null 前导和磁贴标题之间会有一个幻像填充。
        【解决方案10】:

        现在 ListTile 具有 minLeadingWidth 的属性。

        例子

        ListTile(
              minLeadingWidth: 15,
              leading: Icons(Icons.search),
              title: Text("Data");
        

        【讨论】:

          【解决方案11】:

          这几天我也遇到同样的问题,最后我发布了一个可以解决这个问题的包。

          该包在https://pub.dev/packages/list_tile_more_customizable 可用,通过这个包我们可以设置horizo​​ntalTitleGap,当它设置为0.0(零)时,前导和标题之间的填充将为零。

          用法:

          ListTileMoreCustomizable(
              title: Text("Title"),
              trailing: Icon(Icons.people),
              horizontalTitleGap: 0.0,
              onTap: (details){},
              onLongPress: (details){},
          );
          

          已编辑:
          这种方法对我很有用,而且代码在 BSD 许可证下可在https://github.com/Playhi/list_tile_more_customizable (原始代码太长)获得,我很难理解为什么一个用户在没有提交任何问题的情况下对答案投了反对票。

          【讨论】:

          【解决方案12】:

          相反,您可以创建自己的小部件,如下所示:

          1. 假设我们将创建一个名为text_icon.dart 的小部件文件
              import 'package:flutter/material.dart';
          
                class TextIcon extends StatelessWidget {
                  final String title;
                  final IconData icon;
                  final String button;
          
                  const TextIcon({Key key, this.title, this.icon, this.button}) : super(key: key);
          
                  @override
                  Widget build(BuildContext context) {
                    final theme = Theme.of(context);
          
                    return Padding(
                      padding: const EdgeInsets.only(bottom: 24.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Icon(
                           icon,
                           size: 18,
                          ),
                         SizedBox(width: 5),
                         Text(
                           title,
                           style: theme.textTheme.subhead.copyWith(fontSize: 13),
                         ),
                       ],
                     ),
                   );
                 }
               }
          
          1. 在屏幕中调用您的小部件

            TextIcon(icon: Icons.pause_circle_filled, title: "John Doe")
            

          【讨论】:

            【解决方案13】:

            我认为ListTile 不是正确的小部件,更优雅的方法是:

            FlatButton.icon(
                onPressed: null,
                icon: Icon(
                  Icons.flag_rounded,
                  color: Colors.white,
                ),
                label: Text('Title'))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-09-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多