Flutter Injectable只在@module下注册依赖项



我在一个新的扑动项目中使用了Injectable, get_it和auto_route。访问注册为@modules的依赖关系没有问题,但任何带有@injectable,@singleton,@lazysingleton注释的依赖关系…在运行时抛出错误。

错误:FirebaseAuthProvider is not registered inside GetIt.

下面是我的文件和它们的内容

injectable.dart

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

main.dart

Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await configureDependencies(Environment.dev);
runApp(const App());
}

firebase_auth_provider.dart

@dev
@prod
@Singleton(as: AuthProvider, signalsReady: true)
class FirebaseAuthProvider implements AuthProvider {
final FirestoreHelper collection = locator<FirestoreHelper>(param1: USERS_COLLECTION);
final FirebaseAuth _firebaseAuth;
FirebaseAuthProvider(this._firebaseAuth);
Future<UserCredential> signInAnonymously() async {
try {
return await _firebaseAuth.signInAnonymously();
} on FirebaseAuthException catch (e) {
throw RequestError(message: ExceptionsFormatter.firebase(code: e.code));
}
}
...

在这个文件中注册的一切都运行良好。

modules.dart

@module
abstract class CoreModules{
@singleton
AppRouter get appRouter => AppRouter(authGuard: AuthGuard());
@lazySingleton
FirebaseFirestore get firestore => FirebaseFirestore.instance;
@lazySingleton
FirebaseAuth get firebaseAuth => FirebaseAuth.instance;
@lazySingleton
Dio get dio => Dio();
@prod
@preResolve
Future<FirebaseApp> get initFirebase async => await FirebaseService.init();
@dev
@preResolve
Future<FirebaseService> get initDevFirebase async => await FirebaseService.initDev();
}

我为auto_route写了一个保护,每当我运行我的应用程序时,它就会抛出一个错误,试图注入FirebaseAuthProvider

错误:FirebaseAuthProvider is not registered inside GetIt.

auth_guard.dart

class AuthGuard extends AutoRouteGuard{
@override
void onNavigation(NavigationResolver resolver, StackRouter router) async {
FirebaseAuth firebaseAuth = locator<FirebaseAuth>();
FirebaseAuthProvider firebaseAuthProvider = locator<FirebaseAuthProvider>();
bool authenticated = firebaseAuth.currentUser == null;
//
if(!authenticated){
await firebaseAuthProvider.signInAnonymously();
}
//
locator<AppRouter>().replace(HomePageRoute(message: 'This is a test message from auth guard'));
// resolver.next(true);
}
}

如果上下文还不是很清楚,我会提供更多的细节。谢谢你的贡献。

我认为调用FirebaseAuthProvider的正确方法是通过它的抽象类。我还是不太清楚,也许是因为我对这种模式不太熟悉。但是下面的代码可以工作。

正确的AuthProvider将根据你正在工作的环境实例化。

class AuthGuard extends AutoRouteGuard{
@override
void onNavigation(NavigationResolver resolver, StackRouter router) async {
FirebaseAuth firebaseAuth = locator<FirebaseAuth>();
AuthProvider firebaseAuthProvider = locator<AuthProvider>();
bool authenticated = firebaseAuth.currentUser != null;
if(!authenticated){
await firebaseAuthProvider.signInAnonymously();
}
locator<AppRouter>().replace(HomePageRoute(message: 'This is a test message from auth guard'));
}
}

我还必须在抽象类中手动创建signinanonymous方法。这不是我想要的设计,但我现在会坚持这样做,直到我找到一个更好的方法。

最新更新