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
相关产品推荐
相关产品推荐

