Flutter GetIt代码生成异常:LogOutput未注册报错排查
问题
使用GetIt管理依赖时遇到问题:针对不同环境实现了3种LogOutput,但FirebaseLogOutput和ConsoleLogOutput的注册代码位于LoggerService之后,导致开发环境运行应用时出现“LogOutput not registered in get_it”错误,需要排查思路。
对应的注册代码如下:
gh.factory<_i9.LogOutput>( () => _i10.NoLogOutput(), registerFor: {_integrationTest}, ); gh.singleton<_i9.Logger>( () => _i11.LoggerService(logOutput: gh<_i9.LogOutput>())); gh.factory<_i9.LogOutput>( () => _i12.FirebaseLogOutput(), registerFor: { _alpha, _beta, _production, }, ); ... gh.factory<_i9.LogOutput>( () => _i30.ConsoleLogOutput(), registerFor: {_development}, );
排查思路
- 调整依赖注册顺序:GetIt在创建
LoggerService单例时会立即解析gh<_i9.LogOutput>(),但此时对应开发环境的ConsoleLogOutput还未完成注册。必须将所有环境的LogOutput实现注册放在LoggerService的单例注册之前,确保GetIt能找到对应环境的实例。 - 校验环境标识正确性:确认当前运行的开发环境已正确设置
_development标识,避免因环境标识不匹配,导致GetIt无法匹配到对应的ConsoleLogOutput注册规则。 - 检查注册规则的环境冲突:核对各
LogOutput的registerFor参数,确保_development未被其他注册规则占用,且每个环境的标识唯一无重叠。 - 尝试延迟依赖获取(备选方案):如果调整注册顺序存在限制,可以将
LoggerService中LogOutput的注入改为延迟获取,比如使用gh.lazy<_i9.LogOutput>(),或者在LoggerService内部按需调用GetIt获取实例,避免在构造阶段立即解析依赖。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

