You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter项目中使用Injectable、get_it与auto_route时@Singleton注解依赖注册失败问题

解决Injectable注册依赖无法被GetIt获取的问题

看起来你遇到的问题是@Singleton注解的FirebaseAuthProvider没有被正确注册到GetIt中,但@module里的依赖能正常访问。我帮你梳理几个最可能的原因和对应的解决方案:

1. 确保Injectable代码已重新生成

Injectable完全依赖代码生成来生成依赖注册逻辑,如果你修改了注解或者新增了带注解的类,必须重新运行build_runner:

flutter pub run build_runner build --delete-conflicting-outputs

或者用watch模式实时生成:

flutter pub run build_runner watch --delete-conflicting-outputs

运行完成后,检查项目根目录下的injectable.config.dart文件,搜索FirebaseAuthProvider,确认它是否出现在注册代码中,并且对应了你指定的dev环境。

2. 检查环境标签的定义是否正确

你的FirebaseAuthProvider用了@dev @prod注解,但需要确保你在代码中正确定义了这些环境常量。在你的injectable.dart文件中,应该添加这些定义:

final GetIt locator = GetIt.instance;

// 必须定义环境常量
const dev = Environment('dev');
const prod = Environment('prod');

@InjectableInit()
Future<void> configureDependencies(String environment) async => await $initGetIt(locator, environment: environment);

如果没有这些定义,Injectable无法识别@dev和@prod标签,会导致这个类不会被注册到对应的环境中。

3. 调整路由守卫的依赖获取时机

你的AuthGuard是在AppRouter的构造函数中传入的,而AppRouter在CoreModules中用@singleton标记,这意味着GetIt会在初始化阶段就创建AppRouter实例,此时FirebaseAuthProvider可能还没完成注册。

解决方法是把AppRouter的注册改成@lazySingleton,这样它只会在第一次被使用时才创建,此时所有依赖都已完成注册:

@module
abstract class CoreModules{
 @lazySingleton // 从@singleton改成@lazySingleton
 AppRouter get appRouter => AppRouter(authGuard: AuthGuard());
 // ... 其他依赖
}

4. 处理signalsReady: true的异步初始化问题

你的FirebaseAuthProvider用了signalsReady: true,这表示这个依赖是异步初始化的。虽然你在configureDependencies中用了await $initGetIt,但如果获取时没有等待它准备好,也可能抛出错误。

尝试在AuthGuard中改用异步获取:

class AuthGuard extends AutoRouteGuard{
 @override
 void onNavigation(NavigationResolver resolver, StackRouter router) async {
  FirebaseAuth firebaseAuth = locator<FirebaseAuth>();
  // 改用getAsync等待依赖初始化完成
  FirebaseAuthProvider firebaseAuthProvider = await locator.getAsync<FirebaseAuthProvider>();
  // ... 后续逻辑
 }
}

如果不需要异步初始化的信号,也可以暂时去掉signalsReady: true,看是否能解决问题,再根据实际需求决定是否保留。

额外检查

  • 确认FirebaseAuthProvider所在的文件已经被正确导入到项目中,没有被忽略在代码生成之外。
  • 检查injectable.config.dart中的注册顺序,确保FirebaseAuthProvider的注册在AppRouter之前(如果还是用@singleton的话)。

内容的提问来源于stack exchange,提问作者Limitless Claver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:02:26