使用Flutter Injectable插件遇FirebaseAuthRepository未注册错误求助
解决Flutter Injectable插件中FirebaseAuthRepository未注册的问题
问题根源
错误提示FirebaseAuthRepository未在GetIt中注册,但你的实现类FirebaseAuthRepositoryImpl已添加@Injectable(as: FirebaseAuthRepository)注解,问题出在生成的依赖注册代码未正确绑定抽象类与实现类,或环境配置未匹配。
解决方案
1. 移除抽象类的@injectable注解
抽象类无法实例化,添加@injectable会导致Injectable错误尝试注册抽象类本身,直接移除:
// 正确写法:抽象类无需@injectable abstract class FirebaseAuthRepository { Future<Either<Failure, UserCredential>> authSignInEmailPassword(String email, String password); // ... 其他方法 }
2. 修正生成的注册代码绑定关系
检查自动生成的init方法,当前代码仅注册了FirebaseAuthRepositoryImpl,需修改为注册抽象类FirebaseAuthRepository:
// 替换原有的FirebaseAuthRepositoryImpl注册行 gh.lazySingleton<_i7.FirebaseAuthRepository>( () => _i4.FirebaseAuthRepositoryImpl( remoteDataSource: gh<_i5.FirebaseAuthenticationRemoteDataSource>()), registerFor: {_prod}, );
若不想手动修改,可通过重新运行build_runner生成正确代码(见步骤4)。
3. 初始化GetIt时指定正确环境
你的依赖注册使用了registerFor: {_prod},初始化GetIt必须指定环境为prod,否则该依赖不会被加载:
void main() { // 初始化时传入prod环境 GetIt.instance.init(environment: 'prod'); runApp(MyApp()); }
4. 重新生成依赖注册代码
运行build_runner命令,确保生成最新的注册代码覆盖旧代码:
flutter pub run build_runner build --delete-conflicting-outputs
5. 检查实例获取方式
确保代码中通过抽象类获取实例,而非直接获取实现类:
// 正确:通过抽象类获取实例 final authRepo = GetIt.instance<FirebaseAuthRepository>(); // 错误:直接获取实现类(除非额外注册了实现类) // final authRepo = GetIt.instance<FirebaseAuthRepositoryImpl>();
内容的提问来源于stack exchange,提问作者Koya
相关产品推荐
相关产品推荐

