Flutter使用get_it注入UseCase时报instanceFactory!=null断言错误如何解决
问题根因
get_it依赖注入是按注册时指定的类型严格匹配查找实例的,你注册时使用的泛型类型是抽象类UseCase<InitSlider, InitSliderParams>,但你获取实例时调用的是sl<GetInitSliders>(),用具体实现类GetInitSliders作为查找key,两者类型不匹配,因此框架判定对应类型的实例工厂未注册,抛出异常。
解决方案
你可以根据自己的编码需求二选一:
方案1:注册时指定具体实现类类型
如果需要直接获取GetInitSliders类实例,修改注册代码的泛型即可:
// 把原注册代码的泛型从抽象类改为具体实现类 sl.registerLazySingleton<GetInitSliders>(() => GetInitSliders(sl()));
修改后调用sl<GetInitSliders>()即可正常获取实例。
方案2:调用时使用注册的抽象类类型
如果你的代码是基于抽象接口依赖,不需要感知具体实现类,修改调用侧的获取代码即可:
// 调用处不要用具体实现类作为泛型参数,改用注册时的抽象类类型 final useCase = sl<UseCase<InitSlider, InitSliderParams>>();
附加检查&优化点
- 确认启动App前已经完成依赖初始化,你的
init方法是异步方法,必须加await等待执行完成:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await init(); // 必须加await runApp(const MyApp()); }
- 建议调整依赖注册顺序,按照「底层依赖->上层依赖」的顺序注册,避免后续如果改为非懒加载注册时出现依赖找不到的问题,调整后参考:
final sl = GetIt.instance; Future<void> init() async { sl.registerLazySingleton<NetworkInfo>(() => NetworkInfoImpl(sl())); // 先注册底层数据源 sl.registerLazySingleton<InitSliderDatasource>( () => InitSliderRemoteDatasourceImpl(client: sl()), ); // 再注册仓库层 sl.registerLazySingleton<InitSliderRepository>( () => InitSliderRepositoryImpl( networkInfo: sl(), remoteDatasource: sl(), ), ); // 最后注册上层UseCase sl.registerLazySingleton<GetInitSliders>(() => GetInitSliders(sl())); }
内容的提问来源于stack exchange,提问作者Omer Ciftci
相关产品推荐
相关产品推荐

