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

在Widget中初始化get_it的正确位置?代码实现合理性求证

当前代码的GetIt初始化位置完全错误,会直接引发崩溃

问题核心原因:

  • 初始化顺序颠倒:State类的成员变量final store = getIt.get<FormStore>()会在initState执行前就被初始化,此时GetIt中还未注册FormStore,直接抛出NotFoundException。
  • 重复注册风险:即便绕过顺序问题,当FormExample组件被重建时,initState会再次执行registerSingleton,而GetIt默认不允许重复注册单例,会抛出AlreadyRegisteredException。

修正后的代码示例(仅满足演示需求):

import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';

import 'form_store.dart';

final getIt = GetIt.instance;

class FormExample extends StatefulWidget {
  const FormExample();

  @override
  _FormExampleState createState() => _FormExampleState();
}

class _FormExampleState extends State<FormExample> {
  // 使用late延迟初始化,避免提前调用getIt.get
  late final FormStore store;

  @override
  void initState() {
    super.initState();
    // 注册前先检查是否已存在,避免重复注册报错
    if (!getIt.isRegistered<FormStore>()) {
      getIt.registerSingleton<FormStore>(FormStore());
    }
    // 注册完成后再获取实例
    store = getIt.get<FormStore>();
    store.setupValidations();
  }

  // ... 其他代码

// 内部组件保持不变
class InnerPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final store = GetIt.I<FormStore>();
    return Scaffold(
      body: Center(child: Text('Hello ${store.name}')),
    );
  }
}

额外提醒:

虽然是演示需求,但不建议在Widget内部初始化GetIt。最佳实践仍是在runApp()调用之前完成全局依赖注入的初始化,避免组件重建带来的重复注册、状态混乱等问题。

内容的提问来源于stack exchange,提问作者rozerro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:40:16