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

Flutter:如何在PaginatedDataTable中实现独立可编辑的TextField单元格?

问题原因

你遇到的核心问题是所有单元格的TextField共用了同一个TextEditingController实例,导致编辑任意单元格时,所有输入框都会同步显示相同内容——因为它们绑定的是同一个数据源。

解决方案

给每一行的TextField单独分配一个TextEditingController,确保每个输入框的状态独立。具体实现如下:

1. 修改VDataTable类

维护一个控制器列表,每个索引对应一行的控制器,同时添加资源释放逻辑避免内存泄漏:

class VDataTable extends DataTableSource {
  // 为每一行单独创建控制器
  final List<TextEditingController> _controllers = [];

  VDataTable() {
    // 初始化控制器,数量与数据行数一致
    for (int i = 0; i < strVerbsData.length; i++) {
      _controllers.add(TextEditingController());
    }
  }

  @override
  DataRow? getRow(int index) {
    if (index >= _controllers.length) return null;
    
    return DataRow(cells: [
      DataCell(
        TextField(
          controller: _controllers[index], // 使用对应行的控制器
          onSubmitted: (value) {
            if (value.isNotEmpty && value == strVerbsData[index]["A"].toString()) {
              print('Correct');
            }
          },
        ),
      ),
    ]);
  }

  @override
  bool get isRowCountApproximate => false;

  @override
  int get rowCount => strVerbsData.length;

  @override
  int get selectedRowCount => 0;

  // 释放控制器资源,避免内存泄漏
  void dispose() {
    for (var controller in _controllers) {
      controller.dispose();
    }
  }
}

2. 更新主页面代码

在页面的生命周期中初始化并释放VDataTable的资源:

class _MyHomePageState extends State<MyHomePage> {
  late final VDataTable _data;

  @override
  void initState() {
    super.initState();
    _data = VDataTable();
  }

  @override
  void dispose() {
    _data.dispose(); // 释放控制器资源
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            PaginatedDataTable(
              columns: const [
                DataColumn(label: Text("A")),
                DataColumn(label: Text("B")),
              ],
              source: _data,
            ),
          ],
        ),
      ),
    );
  }
}
原理说明

每个TextField绑定了对应行的独立控制器,输入内容只会存储在当前行的控制器中,不会影响其他单元格。同时通过dispose方法释放控制器资源,避免长期占用内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:23:22