【发布时间】:2021-02-04 10:10:43
【问题描述】:
我使用FirebaseAuth 进行身份验证,并定义了以下提供程序:
final _authStateChangesProvider = StreamProvider<User>(
(ref) => ref.watch(authServiceProvider).authStateChanges);
数据库依赖于用户,所以我只能在用户登录后创建它。问题是数据库创建是异步的,所以它的提供者必须是 FutureProvider。
final databaseFutureProvider = FutureProvider<Database>((ref) {
final authStateChange = ref.watch(_authStateChangesProvider);
final user = authStateChange.data?.value;
if (user != null) {
return FirestoreDatabase.create(user: user);
}
throw UnsupportedError("The database cannot be accessed before the sign-in");
});
这会使整个应用程序的代码更加繁琐。我想让databaseFutureProvider 成为一个简单的Provider,以使应用程序的代码更简洁。怎么可能?
编辑
最好将数据库创建作为身份验证过程的一部分,这样authStateChangesProvider 只会在数据库创建后触发。类似于以下内容:
final authStateChangesProvider = FutureProvider<User>((ref) {
final authStateChanged = ref.watch(_authStateChangesProvider);
final user = authStateChanged.data?.value;
if (user != null) {
// await the creation of the database provider
}
return user;
});
这样,只有authStateChangesProvider 将成为FutureProvider。但我对 Riverpod 很陌生,我不确定是否以及如何在另一个提供程序中创建一个提供程序。
【问题讨论】:
-
你已经完成了——比如,你没有在 FutureProvider 中使用 async/await,所以只需将其更改为 Provider。
-
抱歉,问题可能不清楚,但
FirestoreDatabase.create(user: user)函数是异步的,所以我不能只将FutureProvider更改为Provider。 -
我已经编辑了这个问题。我希望现在更清楚我想要实现的目标。