Flutter Form Builder移除动态TextField后断言错误及注销字段求助
解决Flutter Form Builder 7.7.0动态删除字段后的断言错误
问题根源
动态删除包含FormBuilderTextField的Cell后,FormBuilder内部的_fields字典未同步移除对应字段记录,页面销毁时遍历_fields执行unregisterField操作,因找不到字段触发'_fields.containsKey(name)': is not true断言错误。
解决方案
1. 给动态字段分配唯一名称
每个动态生成的FormBuilderTextField必须有唯一的name,可通过索引或UUID生成:
FormBuilderTextField( name: 'dynamic_field_${index}', // 用列表索引确保唯一性 // 其他配置(提示文本、验证规则等) )
2. 删除Cell时手动注销字段
执行删除操作前,先调用FormBuilder的unregisterField方法传入对应字段的name,再更新数据源移除Cell:
// 假设formKey是FormBuilder的GlobalKey<FormBuilderState> void removeCell(int index) { final targetFieldName = 'dynamic_field_$index'; // 先注销字段,同步FormBuilder内部状态 formKey.currentState?.unregisterField(targetFieldName); // 再更新数据源,刷新UI setState(() { yourDynamicFieldsList.removeAt(index); }); }
3. 进阶方案:封装Cell实现自动注销
若担心手动注销遗漏,可将每个Cell封装为独立的StatefulWidget,在dispose阶段自动注销字段:
class DynamicTextFieldCell extends StatefulWidget { final String fieldName; final GlobalKey<FormBuilderState> formKey; const DynamicTextFieldCell({ super.key, required this.fieldName, required this.formKey, }); @override State<DynamicTextFieldCell> createState() => _DynamicTextFieldCellState(); } class _DynamicTextFieldCellState extends State<DynamicTextFieldCell> { @override void dispose() { // 组件销毁时自动同步注销FormBuilder字段 widget.formKey.currentState?.unregisterField(widget.fieldName); super.dispose(); } @override Widget build(BuildContext context) { return FormBuilderTextField( name: widget.fieldName, // 其他配置项 ); } }
使用时只需传入字段名和FormBuilder的key,无论删除Cell还是页面销毁,都会自动完成字段注销,彻底避免断言错误。
内容的提问来源于stack exchange,提问作者A. Amini
相关产品推荐
相关产品推荐

