在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
相关产品推荐
相关产品推荐

