【问题标题】:DataTable column width issuesDataTable 列宽问题
【发布时间】:2020-08-25 03:56:18
【问题描述】:

我正在尝试在Flutter 中构建一个全宽DataTable,左侧有一个固定宽度的列,另外两列应该将其余列分开。

但是,即使左侧标题文本被截断,中间和右侧列也不会占用剩余宽度,如下所示:

当文本太宽而无法在单行中显示时,我还想将文本换行,但 Wrap 没有按预期工作。

我该如何解决我的问题?

代码如下:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Column(children: [
          Expanded(
            child: Container(
              constraints: BoxConstraints.expand(width: double.infinity),
              child: SingleChildScrollView(
                child: DataTable(
                    headingRowHeight: 32,
                    dataRowHeight: 24,
                    columns: [
                      DataColumn(
                        label: ConstrainedBox(
                          constraints: BoxConstraints(
                            maxWidth: 20,
                            minWidth: 20,
                          ),
                          child: Text('Short column'),
                        ),
                      ),
                      DataColumn(label: Text('Long column')),
                      DataColumn(label: Text('Long column')),
                    ],
                    rows: [
                      DataRow(
                        cells: [
                          DataCell(
                            ConstrainedBox(
                              constraints: BoxConstraints(
                                maxWidth: 20,
                                minWidth: 20,
                              ),
                              child: Text('1'),
                            ),
                          ),
                          DataCell(
                            Wrap(
                              children: [
                                Text(
                                    """Some long content i would like to be wrapped when column width is not
                              enought to fully display it"""),
                              ],
                            ),
                          ),
                          DataCell(Text('Some more text')),
                        ],
                      ),
                      DataRow(
                        cells: [
                          DataCell(Container(
                            color: Colors.pink,
                            child: ConstrainedBox(
                              constraints: BoxConstraints(
                                maxWidth: 20,
                                minWidth: 20,
                              ),
                              child: Text('2'),
                            ),
                          )),
                          DataCell(
                            Wrap(
                              children: [
                                Container(
                                    color: Colors.yellow,
                                    child: Text(
                                        """Some long content i would like to be wrapped when column width is not
                              enought to fully display it""")),
                              ],
                            ),
                          ),
                          DataCell(Text('Some more text')),
                        ],
                      )
                    ]),
              ),
            ),
          ),
        ]),
      ),
    );
  }
}

编辑

感谢@awaik 的回答,但在您的示例中,表格没有占据整个设备的宽度,它仍然在中间有一个大屏幕,这不是我想要的。

另外,行高是恒定的,如果内容需要更高的高度,它不会增加。

有什么可以做的吗?

【问题讨论】:

    标签: flutter datatable width flutter-desktop


    【解决方案1】:

    DataTable 有一些默认值:

    DataTable({
      Key key,
      @required this.columns,
      this.sortColumnIndex,
      this.sortAscending = true,
      this.onSelectAll,
      this.dataRowHeight = kMinInteractiveDimension,
      this.headingRowHeight = 56.0,
      this.horizontalMargin = 24.0,
      this.columnSpacing = 56.0,
    

    在删除了一些小部件的固定示例下方。

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: SafeArea(
              child: DataTable(
                horizontalMargin: 6.0,
                columnSpacing: 6.0,
                headingRowHeight: 32.0,
                dataRowHeight: 100.0,
                columns: [
                  DataColumn(
                    label: ConstrainedBox(
                      constraints: BoxConstraints(
                        maxWidth: 20,
                        minWidth: 20,
                      ),
                      child: Text('Short column'),
                    ),
                  ),
                  DataColumn(label: Text('Long column')),
                  DataColumn(label: Text('Three')),
                ],
                rows: [
                  DataRow(
                    cells: [
                      DataCell(
                        Text('1'),
                      ),
                      DataCell(
                        Container(
                          child: Text(
                            'Some long content i would like to be wrapped ',
                          ),
                        ),
                      ),
                      DataCell(Text('Some more text')),
                    ],
                  ),
                  DataRow(
                    cells: [
                      DataCell(Container(
                        color: Colors.pink,
                        child: Text('2'),
                      )),
                      DataCell(
                          Container(
                            height: 500,
                            color: Colors.yellow,
                            child: Text(
                              'Some long content i would like to be wrapped when column width is not enought to fully display itSome long content i would like to be wrapped when column width is not display it Some long content i would like to be wrapped when column width is not enought to fully display itSome long content i would like to be wrapped when column width is not display it Some long content i would like to be wrapped when column width is not enought to fully display itSome long content i would like to be wrapped when column width is not display it 555',
                            ),
                          ),
                          placeholder: false),
                      DataCell(Text('Some more text')),
                    ],
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    

    编辑

    1. 上面的代码已经更新。
    2. 表格未采用全宽,因为我们使用了带有树“””的多行字符串。如果我们使用常规字符串,则行为正常。
    3. 行的高度是在构造函数中设置的,不能动态改变。

      孩子:数据表( 水平边距:6.0, 列间距:6.0, 标题行高度:32.0, 数据行高度:100.0,

    最后,我个人的观点 - 使用 DataTable 创建自己的小部件会更容易

    【讨论】:

    • 感谢@awaik 的回答,但这并不能解决我的问题。请检查我的编辑
    • 我尝试了更新的代码,但它仍然没有占用全宽。无论如何,正如你所说,我发现DataTable 可能不是我需要的最佳小部件
    【解决方案2】:

    我发现普通的Table 可以让我做我想做的事:我可以将FixedColumnWidth 用于某个列,将FlexColumnWidth 用于其他列以占用剩余空间。

    此外,文本被正确换行并增加行高以适应内容,如下图所示,屏幕宽度较小,屏幕宽度较大:

    这是代码:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: Column(children: [
              Expanded(
                child: Container(
                  child: SingleChildScrollView(
                    child: Table(
                      border: TableBorder.all(width: 1),
                      columnWidths: {
                        0: FixedColumnWidth(20),
                      },
                      defaultColumnWidth: FlexColumnWidth(),
                      children: [
                        TableRow(children: [
                          Text('Short column'),
                          Text('Long column'),
                          Text('Long column')
                        ]),
                        TableRow(
                          children: [
                            Text('1'),
                            Text(
                                'Some long content i would like to be wrapped when column width is not enought to fully display it'),
                            Container(
                              child: Text('Some more text'),
                            )
                          ],
                        )
                      ],
                    ),
                  ),
                ),
              ),
            ]),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 2015-07-12
      • 2012-02-12
      • 2010-10-15
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多