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

使用Provider与GetIt包时出现Dio未注册GetIt的Bad state错误

问题解决:GetIt中Dio未注册的错误

错误原因

你遇到的Bad state: GetIt: Object/factory with type Dio is not registered错误,主要有两个问题:

  1. Dio注册方式错误:你用sl.registerSingleton(() => Dio())传递了工厂函数,但registerSingleton需要直接传入实例对象,而非返回实例的函数。
  2. 依赖注册顺序颠倒:被依赖的对象(如LoggingInterseptor、SharedPreferencesProvider、AuthRepoUser)注册晚于依赖它们的对象,导致GetIt无法解析依赖。

修正后的代码

Future<void> setup() async {
  // 先注册基础依赖:Dio、日志拦截器、SharedPreferences工具类
  sl.registerSingleton(Dio()); // 直接注册Dio实例,或用懒加载:sl.registerLazySingleton(() => Dio());
  sl.registerLazySingleton<LoggingInterseptor>(() => LoggingInterseptor());
  sl.registerLazySingleton(() => SharedPreferencesProvider());

  // 注册依赖基础对象的DioClient
  sl.registerLazySingleton(() => DioClient(
        AppConstants.apiBaseURL,
        sl(),
        loggingInterseptor: sl(),
        sharedPreferences: sl(),
      ));

  // 用户模块:先注册Repo,再注册Provider(Provider依赖Repo)
  sl.registerFactory(() => AuthRepoUser(
        dioClient: sl(),
      ));
  sl.registerLazySingleton(() => AuthProvider(authRepoUser: sl()));
}

额外检查点

确认你在其他地方获取GetIt实例时,使用的是:

final sl = GetIt.instance;

而非GetIt.instance()(带括号会创建新的GetIt实例,而非使用全局单例)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:26