【问题标题】:Flutter Table layout is not responding according to expectedFlutter Table 布局未按预期响应
【发布时间】:2020-12-17 00:10:37
【问题描述】:

使用 Flutter v1.20.2

以下代码

var data = [
  ['a', 'VerylongstringwithnospacesVerylongstringwithnospaces'],
  ['abc', '123456789'],
  ['abcdefg', '123'],
];


Expanded(
  child: Table(
    border: TableBorder.all(color: Colors.red),
    columnWidths: {
      0: IntrinsicColumnWidth(),
      1: IntrinsicColumnWidth(),
    },
    children: data.map<TableRow>((x) => (
      TableRow(
        children: <TableCell>[
          TableCell(child: Container(child: Text(x[0]))),
          TableCell(child: Container(color: Colors.green, child: Text(x[1]))),
        ],
      )
    )).toList(),
  ),
),

这个布局的结果

如你所见,文字超出了表格的边界。

我尝试了无数的解决方案,但都没有奏效。与表格列的大小相比,TableCell 本身的宽度似乎大于应有的宽度。

最大的问题是两列的大小是未知的,它们可能是数百个字符或单个字母。如果它大于宽度,文本应该换到下一行。

有没有办法制作一个流畅的网格布局,以便两边都根据每列的内容量调整大小?理想的布局应该是这样的

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    发生这种情况的原因是 IntrinsicColumnWidth 没有给出 TableCell 父大小。因为它试图根据子宽度设置列宽。同时,要使文本换行,你需要有父级的宽度,否则文本小部件不知道它的限制。

    你有什么选择:

    • FixedColumnWidth

    • FlexColumnWidth

    • FractionColumnWidth

    • MaxColumnWidth

    • MinColumnWidth

    (最后两个小部件使用了其他 TableColumnWidth 小部件的最大值/最小值。)

    在您的情况下,如果您知道第一列中的文本永远不需要换行,您可以删除 IntrinsicColumnWidth 作为第二列的参数。如果您知道可以使用长文本,请通过添加 MinColumnWidth 来添加最大宽度

    dartpad example

    【讨论】:

    • 谢谢,这帮助我发现了问题所在,我最终采用了不同的方法,通过计算每个字符串的最小/最大长度并按照您提到的设置一个 fractionWidth。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多