Flutter中如何修复@immutable类存在非final实例字段的报错
问题原因
所有继承自
Widget的类(包括StatefulWidget、StatelessWidget)都被@immutable注解标记,要求类的所有实例属性必须为final修饰的不可变字段,你代码中formKey、perusahaanController、alamatController三个字段没有加final修饰,不符合不可变类的约束,因此触发报错。
修复步骤
- 给
formKey、perusahaanController、alamatController三个字段添加final修饰符 - 把字段的默认赋值逻辑移到构造函数的可选参数默认值位置,不要直接在字段声明处赋值
- 构造函数参数根据空安全要求补充
required标识或可空声明,同时适配默认值逻辑
修复后完整代码
class AppForm extends StatefulWidget { final String perusahaan; final String alamat; // 给三个字段加final修饰 final GlobalKey<FormState> formKey; final TextEditingController perusahaanController; final TextEditingController alamatController; // 构造函数中设置默认值,可根据需求调整参数是否为required AppForm({ super.key, GlobalKey<FormState>? formKey, TextEditingController? perusahaanController, TextEditingController? alamatController, required this.perusahaan, required this.alamat, // 外部没传参数的话自动创建默认实例 }) : formKey = formKey ?? GlobalKey<FormState>(), perusahaanController = perusahaanController ?? TextEditingController(), alamatController = alamatController ?? TextEditingController(); @override State<AppForm> createState() => _AppFormState(); } class _AppFormState extends State<AppForm> { @override Widget build(BuildContext context) { // 调用属性时统一通过widget.前缀访问即可 return Form( key: widget.formKey, child: Column( children: [ TextFormField( controller: widget.perusahaanController, decoration: const InputDecoration(labelText: "Perusahaan"), ), TextFormField( controller: widget.alamatController, decoration: const InputDecoration(labelText: "Alamat"), ), ], ), ); } // 如果控制器是当前组件默认创建的,需要在这里销毁避免内存泄漏 // 注意:如果控制器是父组件传入的,销毁逻辑由父组件负责,不要重复销毁 @override void dispose() { widget.perusahaanController.dispose(); widget.alamatController.dispose(); super.dispose(); } }
补充注意事项
- 所有
StatefulWidget的属性都必须用final修饰,可变状态要放到对应的State类中管理 - 如果你需要在组件生命周期中修改控制器/key的指向,不要直接修改Widget层的属性,而是在State类中声明可变变量存储引用
内容的提问来源于stack exchange,提问作者lisna octavia
相关产品推荐
相关产品推荐

