【问题标题】:Inconsistent height of Card widget in Flutter with ListTile as childFlutter 中 Card 小部件的高度不一致,ListTile 为子级
【发布时间】:2019-11-25 10:23:45
【问题描述】:

当我使用 Card 和 ListTile 作为其子项时,卡片的高度会根据 ListTile 的 subtitle 参数的文本行数而有所不同。如果标题和副标题是单行文本,则存在某种顶部和底部填充(以绿色矩形突出显示)。但是,如果字幕由多行文本组成,则没有顶部和底部填充,并且卡片的高度更小。 是什么导致了这种不一致?如何从卡片 1 和 2 中删除此填充或将其添加到卡片 3?

class CardList extends StatelessWidget {
  List<List<String>> cardList = [
    ["Apple", "Fruit"],
    ["Book", "Thing"],
    [
      "Lorem ipsum",
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vulputate tortor non mi gravida, nec"
    ]
  ];

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
        itemCount: cardList.length,
        itemBuilder: (BuildContext context, int position) {
          return Card(
              elevation: 2.0,
              child: ListTile(
                title: Text(cardList[position][0]),
                subtitle: Text(cardList[position][1]),
              ));
        });
  }
}

screenshot of the problem

【问题讨论】:

    标签: flutter height tile


    【解决方案1】:

    这就是 ListTile 开箱即用的工作方式,如果需要,您可以查看源代码,但不用担心,这是 Flutter,您可以非常轻松地创建和自定义自己的小部件。

    class MyListTile extends StatelessWidget {
      final String title;
      final String subtitle;
    
      const MyListTile({Key key, this.title, this.subtitle}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        final textTheme = Theme.of(context).textTheme;
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                title,
                style: textTheme.subhead,
              ),
              subtitle != null
                  ? Text(
                      subtitle,
                      style: textTheme.body1,
                    )
                  : const SizedBox.shrink()
            ],
          ),
        );
      }
    }
    

    用法

      @override
      Widget build(BuildContext context) {
        return ListView.builder(
            itemCount: cardList.length,
            itemBuilder: (BuildContext context, int position) {
              return Card(
                elevation: 2.0,
                child: MyListTile(
                  title: cardList[position][0],
                  subtitle: cardList[position][1],
                ),
              );
            });
      }
    

    结果

    【讨论】:

    • 谢谢!这是我将来肯定会考虑的一种方法。我还找到了配置图块高度的位置(list_tile.dart -> double get _defaultTileHeight {})。如果 subtitle 包含一行,则返回一个 tile 高度,如果 subtitle 包含两行或多行,则返回另一个高度。
    • 更新:我错了。它不考虑字幕有多少行。它考虑了参数“isThreeLine”(默认为 false)以及是否有字幕。如果您需要从我的示例中删除卡 1 和卡 2 中的填充,您可以在这里简单地设置 56 而不是 72: if (isTwoLine) return isDense ? 64.0:72.0;那么如果你需要给三张全部卡片添加padding,你可以在创建ListTile时通过指定“contentPadding”参数来实现。
    猜你喜欢
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2021-04-26
    • 2019-04-03
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多