使用@injectableInit自动生成代码遇GetIt依赖注入Bad State错误
Dart中@injectableInit自动注入失败,手动注入正常的问题解决
问题场景
使用@injectableInit自动生成GetIt依赖注入初始化代码时,创建HomeBloc触发「Bad state」错误,提示Dio未在GetIt中注册,但切换为手动注入时代码可正常运行。
自动生成的初始化代码
@injectableInit GetIt initDI(GetIt getIt) => getIt.init();
错误信息
════════ Exception caught by widgets library ═══════════════════════════════════ Bad state: Tried to read a provider that threw during the creation of its value. The exception occurred during the creation of type HomeBloc. ══╡ EXCEPTION CAUGHT BY PROVIDER ╞═══════════════════════════════ The following StateError was thrown: Bad state: GetIt: Object/factory with type Dio is not registered inside GetIt. (Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance; Did you forget to register it?) When the exception was thrown, this was the stack: #0 throwIfNot (package:get_it/get_it_impl.dart:12:19) #1 _GetItImplementation._findFactoryByNameAndType (package:get_it/get_it_impl.dart:397:5) #2 _GetItImplementation.get (package:get_it/get_it_impl.dart:425:29) #3 GetItHelper.call (package:injectable/src/get_it_helper.dart:45:13) #4 GetItInjectableX.init.<anonymous closure> (package:flutter_news_bloc/di/di_init.config.dart:31:13) #5 _ServiceFactory.getObject (package:get_it/get_it_impl.dart:172:37) #6 _GetItImplementation.get (package:get_it/get_it_impl.dart:443:34) #7 GetItHelper.call (package:injectable/src/get_it_helper.dart:45:13) #8 GetItInjectableX.init.<anonymous closure> (package:flutter_news_bloc/di/di_init.config.dart:35:51) #9 _ServiceFactory.getObject (package:get_it/get_it_impl.dart:172:37) #10 _GetItImplementation.get (package:get_it/get_it_impl.dart:443:34) #11 _GetItImplementation.call (package:get_it/get_it_impl.dart:465:12) #12 NewsApp.build.<anonymous closure>.<anonymous closure> (package:flutter_news_bloc/app.dart:16:41) #13 _CreateInheritedProviderState.value (package:provider/src/inherited_provider.dart:736:36) #14 _InheritedProviderScopeElement.value (package:provider/src/inherited_provider.dart:590:33) #15 Provider.of (package:provider/src/provider.dart:303:37) #16 ReadContext.read (package:provider/src/provider.dart:649:21) #17 _BlocBuilderBaseState.initState (package:flutter_bloc/src/bloc_builder.dart:130:36) #18 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5602:55) #19 ComponentElement.mount (package:flutter/src/widgets/framework.dart:5447:5) #20 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4326:16) #21 Element.updateChild (package:flutter/src/widgets/framework.dart:3831:20) #22 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #23 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #24 StatelessElement.update (package:flutter/src/widgets/framework.dart:5547:5) #25 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #26 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #27 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #28 StatelessElement.update (package:flutter/src/widgets/framework.dart:5547:5) #29 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #30 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #31 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #32 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #33 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #34 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #35 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #36 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #37 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #38 Element.updateChildren (package:flutter/src/widgets/framework.dart:3964:32) #39 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6896:17) #40 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #41 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #42 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #43 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #44 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #45 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #46 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #47 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #48 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #49 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #50 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #51 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #52 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #53 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #54 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #55 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #56 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #57 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #58 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #59 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #60 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #61 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #62 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #63 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #64 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6743:14) #65 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #66 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #67 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #68 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #69 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #70 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6743:14) #71 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #72 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #73 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #74 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #75 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #76 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #77 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #78 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #79 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #80 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #81 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #82 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #83 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #84 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #85 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #86 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #87 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #88 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #89 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #90 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #91 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #92 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #93 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #94 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #95 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #96 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #97 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #98 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #99 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #100 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #101 ProxyElement.update (package:flutter/src/widgets/framework.dart:5800:5) #102 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #103 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #104 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5634:11) #105 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #106 StatefulElement.update (package:flutter/src/widgets/framework.dart:5657:5) #107 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15) #108 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5496:16) #109 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7) #110 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2895:19) #111 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:984:21) #112 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:457:5) #113 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1325:15) #114 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1255:9) #115 SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:978:7) #119 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12) (elided 3 frames from class _Timer and dart:async-patch) ═════════════════════════════════════════════════════════════════ The relevant error-causing widget was: ════════════════════════════════════════════════════════════════════════════════ D/EGL_emulation(10636): app_time_stats: avg=27455.90ms min=73.91ms max=109310.17ms count=4
手动注入可正常运行的代码
@injectableInit void initDI(GetIt getIt) { final dio = Dio(); // Create a Dio instance getIt.registerSingleton<Dio>(dio); // Register it as a singleton getIt.registerSingleton<AppRouter>(AppRouter()); // Register it as a singleton getIt.registerSingleton<ApiProvider>(ApiProvider(dio)); // Register it as a singleton getIt.registerSingleton<HomeBloc>(HomeBloc(ApiProvider(dio))); // Register it as a singleton }
解决方案
1. 为第三方库Dio创建注册模块
Injectable默认只识别带有@injectable注解的自定义类,第三方库类需要通过@module注解手动注册:
@module abstract class DioModule { @singleton Dio get dio => Dio(); }
2. 确保自定义类正确标记依赖注解
- ApiProvider需要标记
@injectable,并通过构造函数接收Dio依赖:
@injectable class ApiProvider { final Dio dio; ApiProvider(this.dio); }
- HomeBloc同样标记
@injectable,通过构造函数接收ApiProvider依赖:
@injectable class HomeBloc extends Bloc<HomeEvent, HomeState> { final ApiProvider apiProvider; HomeBloc(this.apiProvider) : super(HomeInitial()) { // 业务逻辑 } }
3. 重新生成依赖注入代码
执行代码生成命令,确保自动生成的配置文件包含所有依赖的注册:
flutter pub run build_runner build --delete-conflicting-outputs
4. 检查初始化调用方式
确保GetIt实例获取正确,并且初始化函数调用正确:
final getIt = GetIt.instance; void setupDI() { initDI(getIt); }
内容的提问来源于stack exchange,提问作者Jay gajjar
相关产品推荐
相关产品推荐

