Flutter DataTable2的TextFormField选日期后如何赋值避免整列值相同
DataTable2行内日期选择器绑定单行列值解决方案
问题根源
- 全局通用的
_selectedDate变量未关联点击行的独立数据,选完日期无法定位要赋值的目标行 - 所有行的
TextFormField共用同一个TextEditingController时,控制器数值变更会同步到所有绑定的输入控件,导致所有行值同步
解决方案
第一步:改造日期选择方法,关联当前行数据
修改_pickDateDialog,接收当前点击行的实体对象作为入参,选完日期直接修改对应行的属性:
// 入参的类名替换成你自己的mainScheduleModel对应的实体类名即可 void _pickDateDialog(ScheduleModel currentRowData) { showDatePicker( context: context, initialDate: DateTime.now(), firstDate: DateTime(1950), lastDate: DateTime.now() ).then((pickedDate) { if (pickedDate == null) return; // 日期格式可根据自己的业务需求调整 String formattedDate = "${pickedDate.year}-${pickedDate.month.toString().padLeft(2,'0')}-${pickedDate.day.toString().padLeft(2,'0')}"; setState(() { // 直接修改当前行的日期属性 currentRowData.boardingDate = formattedDate; }); // 同步更新Provider数据 Provider.of<SchedulesProvider>(context, listen: false).editData(currentRowData); }); }
第二步:修改输入框点击回调,传入当前行数据
将TextFormField的onTap回调改为传入当前遍历到的行数据:
onTap: () => _pickDateDialog(data),
第三步:移除共用的TextEditingController
你当前的场景下,TextFormField已经通过initialValue绑定了当前行的data.boardingDate属性,只要行数据变更后调用setState触发页面重绘,对应行的输入框会自动更新数值,完全不需要额外配置控制器,也不会出现多行列值同步的问题。
可选优化(必须使用控制器的场景)
如果业务逻辑必须使用TextEditingController,可以在页面初始化时根据表格行数生成独立的控制器列表,每个索引对应一行的控制器,避免多控件共用同一个控制器:
// 页面内定义控制器列表 List<TextEditingController> dateControllers = []; // 在initState中初始化控制器 @override void initState() { super.initState(); // 给每一行生成独立的控制器 for (var data in mainScheduleModel) { dateControllers.add(TextEditingController(text: data.boardingDate)); } } // 销毁时释放所有控制器 @override void dispose() { for (var controller in dateControllers) { controller.dispose(); } super.dispose(); } // 绑定对应行的控制器到TextFormField TextFormField( controller: dateControllers[mainScheduleModel.indexOf(data)], // 其余属性保持不变 )
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

