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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:27:00