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

Flutter DDD架构下如何在Repository层注入/访问ObjectBox数据库

错误原因分析

你遇到的两个问题的根因分别是:

  1. Store is not ready报错:你将Store注册为异步初始化的Future<Store>类型,但没有告诉injectable需要预先等待这个依赖初始化完成,当你在数据源中直接同步获取Store实例时,get_it还没有完成异步初始化流程,就会抛出该异常。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:57:03