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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17