Flutter 以ListTile作为子项的颤振中卡片小部件的高度不一致

Flutter 以ListTile作为子项的颤振中卡片小部件的高度不一致,flutter,height,tile,Flutter,Height,Tile,当我将Card和ListTile用作其子级时,根据ListTile的subtitle参数的文本行数,卡片的高度会有所不同。如果标题和副标题是单行文本,则会有一些顶部和底部填充(用绿色矩形突出显示)。然而,如果字幕由几行文字组成,则没有顶部和底部填充,并且卡片的高度更小。 是什么导致这种不一致?如何从卡1和卡2移除此填充物或将其添加到卡3 class CardList extends StatelessWidget { List<List<String>> cardLi

当我将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]),
              ));
        });
  }
}
class CardList扩展了无状态小部件{
列表卡片列表=[
[“苹果”、“水果”],
[“书”、“东西”],
[
“公共知识”,
“Lorem ipsum dolor sit amet,是一位杰出的职业女性。nec非mi孕妇的外阴受虐者Vivamus Vulpute tortor”
]
];
@凌驾
小部件构建(构建上下文){
返回ListView.builder(
itemCount:cardList.length,
itemBuilder:(构建上下文,int位置){
回程卡(
标高:2.0,
孩子:ListTile(
标题:文本(卡片列表[位置][0]),
字幕:文本(卡片列表[位置][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{})。如果字幕由一行组成,则返回一个平铺高度;如果字幕由两行或多行组成,则返回另一个平铺高度。更新:我错了。它不考虑字幕有多少行。它考虑了参数“isThreeLine”(默认为false)以及是否有字幕。如果您需要从我的示例中去掉卡1和卡2中的填充,您可以在这里简单地设置56而不是72:If(isTwoLine)return isDense?64.0 : 72.0; 然后,如果需要为三张all卡添加填充,可以在创建ListTile时指定“contentPadding”参数。