You need to enable JavaScript to run this app. Flutter使用get_it注入UseCase时报instanceFactory!=null断言错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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>>();

附加检查&优化点

  1. 确认启动App前已经完成依赖初始化,你的init方法是异步方法,必须加await等待执行完成:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await init(); // 必须加await
  runApp(const MyApp());
}
  1. 建议调整依赖注册顺序,按照「底层依赖->上层依赖」的顺序注册,避免后续如果改为非懒加载注册时出现依赖找不到的问题,调整后参考:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 13:15:03