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

依赖Shared Preferences的用例导致HomeBloc初始化失败,应用首页停滞

解决Injectable注入SharedPreferences导致HomeBloc初始化停滞的问题

问题根源在于SharedPreferences.getInstance()是异步操作,但默认情况下Injectable会同步解析依赖。当HomeBloc初始化时,它依赖的用例需要等待SharedPreferences实例,这个异步等待会导致首页初始化停滞。

解决步骤:

  1. 给SharedPreferences的注入添加@preResolve注解
    修改DatasourceModule,用@preResolve标记异步依赖,让Injectable在应用启动时就完成这个异步操作的解析:

    @module
    abstract class DatasourceModule {
      @preResolve
      @singleton
      Future<SharedPreferences> get provideSharedPreferences async =>
          await SharedPreferences.getInstance();
    }
    
  2. 在main函数中等待依赖初始化完成
    修改main函数,确保在启动应用前,所有预解析的异步依赖都已完成:

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await configureDependencies();
      runApp(const MyApp());
    }
    
  3. 重新生成Injectable代码
    修改注解后,需要重新运行build_runner生成对应的依赖注入代码:

    flutter pub run build_runner build
    

原理说明:

@preResolve会告诉Injectable在调用configureDependencies()时,先等待这个Future完成,而不是在依赖它的对象(比如用例、Bloc)初始化时才去处理异步操作。这样HomeBloc初始化时,所需的SharedPreferences实例已经准备好,不会出现停滞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:33:17