使用Provider与GetIt包时出现Dio未注册GetIt的Bad state错误
问题解决:GetIt中Dio未注册的错误
错误原因
你遇到的Bad state: GetIt: Object/factory with type Dio is not registered错误,主要有两个问题:
- Dio注册方式错误:你用
sl.registerSingleton(() => Dio())传递了工厂函数,但registerSingleton需要直接传入实例对象,而非返回实例的函数。 - 依赖注册顺序颠倒:被依赖的对象(如
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
相关产品推荐
相关产品推荐

