You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter动态生成行的表格添加列方法咨询

给Flutter DataTable自动生成的行添加新列的方法

要给这个自动生成行的DataTable添加新列,只需要同步修改列定义和每行的单元格内容即可,具体操作如下:

步骤1:新增列定义

在DataTable的columns列表里添加新的DataColumn,比如我们新增一个"状态"列:

columns: const <DataColumn>[
  DataColumn(label: Text('Number')),
  DataColumn(label: Text('状态')), // 新增的列
],

步骤2:对应新增每行的单元格

在List<DataRow>.generate的cells数组里,添加与新列对应的DataCell,内容可以根据行数据动态生成,这里我们显示该行的选中状态:

cells: <DataCell>[
  DataCell(Text('Row $index')),
  DataCell(Text(selected[index] ? '已选中' : '未选中')), // 对应新列的单元格内容
],

修改后的完整代码

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: _title,
      home: Scaffold(
        appBar: AppBar(title: const Text(_title)),
        body: const MyStatefulWidget(),
      ),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({super.key});

  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  static const int numItems = 10;
  List<bool> selected = List<bool>.generate(numItems, (int index) => false);

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: double.infinity,
      child: DataTable(
        // 新增了"状态"列
        columns: const <DataColumn>[
          DataColumn(label: Text('Number')),
          DataColumn(label: Text('状态')),
        ],
        rows: List<DataRow>.generate(
          numItems,
          (int index) => DataRow(
            color: MaterialStateProperty.resolveWith<Color?>(
                (Set<MaterialState> states) {
              if (states.contains(MaterialState.selected)) {
                return Theme.of(context).colorScheme.primary.withOpacity(0.08);
              }
              if (index.isEven) {
                return Colors.grey.withOpacity(0.3);
              }
              return null;
            }),
            // 对应新增列添加了单元格内容
            cells: <DataCell>[
              DataCell(Text('Row $index')),
              DataCell(Text(selected[index] ? '已选中' : '未选中')),
            ],
            selected: selected[index],
            onSelectChanged: (bool? value) {
              setState(() {
                selected[index] = value!;
              });
            },
          ),
        ),
      ),
    );
  }
}

核心逻辑就是:列的数量必须和每行单元格的数量保持一致,只要同步修改这两个地方,就能顺利添加新列。如果要加更多列,重复这两步即可——先加列定义,再加对应单元格。

内容的提问来源于stack exchange,提问作者Nessa Jinan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:20:49