Flutter DDD架构下如何在Repository层注入/访问ObjectBox数据库
错误原因分析
你遇到的两个问题的根因分别是:
Store is not ready报错:你将Store注册为异步初始化的Future<Store>类型,但没有告诉injectable需要预先等待这个依赖初始化完成,当你在数据源中直接同步获取Store实例时,get_it还没有完成异步初始化流程,就会抛出该异常。- IDE提示
_store未使用:属于静态检查误报,你已经在构造函数中通过_store.box()初始化了_box,只是后续代码没有直接调用_store变量,不影响运行。
修复步骤
1. 调整ObjectBox注入模块
给Store的注册添加@preResolve注解,告知injectable需要预先等待该异步实例初始化完成再完成整个依赖容器的初始化:
import 'package:injectable/injectable.dart'; import 'package:objectbox/objectbox.dart'; import 'package:test/objectbox.g.dart'; @module abstract class ObjectboxInjectableModule { @preResolve @lazySingleton Future<Store> provideStore() async => await openStore(); }
2. 调整main函数中的get_it初始化逻辑
初始化依赖容器时添加await,等待所有preResolve标注的异步依赖(包括ObjectBox的Store)全部初始化完成后再启动App:
void main() async { // 确保Flutter引擎初始化完成 WidgetsFlutterBinding.ensureInitialized(); // 等待依赖容器完成所有预初始化逻辑 await getIt.init(); runApp(const MyApp()); }
3. 可选:补充Store全局关闭逻辑
Store是全局单例,不需要在页面的dispose方法中关闭,你可以通过监听App生命周期在应用退出时统一关闭:
class MyAppState extends State<MyApp> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.detached) { getIt<Store>().close(); } } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } // 其余代码不变 }
你原有ObjectBoxDataSource的代码不需要任何修改,preResolve完成后get_it会自动注入已经初始化完成的Store实例,不需要你额外处理异步逻辑,也不会出现重复打开Store的性能问题。
内容的提问来源于stack exchange,提问作者w461
相关产品推荐
相关产品推荐

