RiverPod - 如何在不在小部件中的 AsyncValue 上等待使用 FutureProvider
RiverPod - How to await using FutureProvider on AsyncValue not in widget
我需要从 Firebase Cloud Firestore 获取 1 个字段 1 次。我如何使用 Widget 构建之外的提供程序来完成此操作?
以下是我的综合供应商。 appStartupProvider
是一个 FutureProvider,我想从 firestore 中的这个 1 字段中获取 bool
值。但是,appStartupProvider
中的等待声明“'await' 应用于 'AsyncValue',这不是 'Future'”。
final accountStreamProvider = StreamProvider<Account>((ref) {
final database = ref.watch(databaseProvider);
return database != null ? database.accountStream() : const Stream.empty();
});
final _accountSetupCompleteProvider = Provider<AsyncValue<bool>>((ref) {
return ref
.watch(accountStreamProvider)
.whenData((account) => account?.accountSetupComplete ?? false);
});
final appStartupProvider = FutureProvider<bool>((ref) async {
final accountSetupComplete = await ref.watch(_accountSetupCompleteProvider);
return accountSetupComplete;
});
这里显然缺少一些关于组合提供程序和 AsyncValue 的关键知识,但我正在尝试完成 RiverPod Combining Providers 页面上所述的情况,我看到正在使用 await。
await
可通过以下方式使用:
.future
在 FutureProvider
documentation
.last
在 StreamProvider
documentation
例子
final carsListFutureProvider = FutureProvider<List<Car>>((ref) {
final backend = ref.watch(backendProvider);
return backend.getList(pathName, (json) => Car.fromJson(json));
});
final carFutureProvider = FutureProvider.family<Car?,int>((ref,id) async {
final list = await ref.watch(carsListFutureProvider.future);
return list.firstWhereOrNull((e) => e.id == id);
});
目前文档中似乎包含不正确的代码示例。 issue
文档中的示例在您 post 时不正确。它已经更新,现在是正确的。
你可以这样写:
final accountStreamProvider = StreamProvider<Account?>((ref) {
final database = ref.watch(databaseProvider);
return database != null ? database.accountStream() : const Stream.empty();
});
final _accountSetupCompleteProvider = FutureProvider<bool>((ref) async {
final account = await ref.watch(accountStreamProvider.last);
return account?.accountSetupComplete ?? false;
});
final appStartupProvider = FutureProvider<bool>((ref) async {
final accountSetupComplete = await ref.watch(_accountSetupCompleteProvider.future);
return accountSetupComplete;
});
或者:
final accountStreamProvider = StreamProvider<Account?>((ref) {
final database = ref.watch(databaseProvider);
return database != null ? database.accountStream() : const Stream.empty();
});
final _accountSetupCompleteProvider = Provider<AsyncValue<bool>>((ref) {
return ref
.watch(accountStreamProvider)
.whenData((account) => account?.accountSetupComplete ?? false);
});
final appStartupProvider = Provider<bool>((ref) {
final accountSetupComplete = ref.watch(_accountSetupCompleteProvider).maybeWhen(
data: (data) => data,
orElse: () => false,
);
return accountSetupComplete;
});
我需要从 Firebase Cloud Firestore 获取 1 个字段 1 次。我如何使用 Widget 构建之外的提供程序来完成此操作?
以下是我的综合供应商。 appStartupProvider
是一个 FutureProvider,我想从 firestore 中的这个 1 字段中获取 bool
值。但是,appStartupProvider
中的等待声明“'await' 应用于 'AsyncValue',这不是 'Future'”。
final accountStreamProvider = StreamProvider<Account>((ref) {
final database = ref.watch(databaseProvider);
return database != null ? database.accountStream() : const Stream.empty();
});
final _accountSetupCompleteProvider = Provider<AsyncValue<bool>>((ref) {
return ref
.watch(accountStreamProvider)
.whenData((account) => account?.accountSetupComplete ?? false);
});
final appStartupProvider = FutureProvider<bool>((ref) async {
final accountSetupComplete = await ref.watch(_accountSetupCompleteProvider);
return accountSetupComplete;
});
这里显然缺少一些关于组合提供程序和 AsyncValue 的关键知识,但我正在尝试完成 RiverPod Combining Providers 页面上所述的情况,我看到正在使用 await。
await
可通过以下方式使用:
.future
在FutureProvider
documentation.last
在StreamProvider
documentation
例子
final carsListFutureProvider = FutureProvider<List<Car>>((ref) {
final backend = ref.watch(backendProvider);
return backend.getList(pathName, (json) => Car.fromJson(json));
});
final carFutureProvider = FutureProvider.family<Car?,int>((ref,id) async {
final list = await ref.watch(carsListFutureProvider.future);
return list.firstWhereOrNull((e) => e.id == id);
});
目前文档中似乎包含不正确的代码示例。 issue
文档中的示例在您 post 时不正确。它已经更新,现在是正确的。
你可以这样写:
final accountStreamProvider = StreamProvider<Account?>((ref) {
final database = ref.watch(databaseProvider);
return database != null ? database.accountStream() : const Stream.empty();
});
final _accountSetupCompleteProvider = FutureProvider<bool>((ref) async {
final account = await ref.watch(accountStreamProvider.last);
return account?.accountSetupComplete ?? false;
});
final appStartupProvider = FutureProvider<bool>((ref) async {
final accountSetupComplete = await ref.watch(_accountSetupCompleteProvider.future);
return accountSetupComplete;
});
或者:
final accountStreamProvider = StreamProvider<Account?>((ref) {
final database = ref.watch(databaseProvider);
return database != null ? database.accountStream() : const Stream.empty();
});
final _accountSetupCompleteProvider = Provider<AsyncValue<bool>>((ref) {
return ref
.watch(accountStreamProvider)
.whenData((account) => account?.accountSetupComplete ?? false);
});
final appStartupProvider = Provider<bool>((ref) {
final accountSetupComplete = ref.watch(_accountSetupCompleteProvider).maybeWhen(
data: (data) => data,
orElse: () => false,
);
return accountSetupComplete;
});