flutter - RiverPod - 如何在不在小部件中的 AsyncValue 上等待使用 FutureProvider

标签 flutter dart flutter-provider riverpod

我需要从 Firebase Cloud Firestore 获取 1 个字段 1 次。我如何使用 Widget 构建之外的提供程序完成此操作?
以下是我的组合提供商。 appStartupProvider是 FutureProvider,我想获得 bool firestore 中此 1 字段的值。但是,等待 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 正在使用。
enter image description here

最佳答案

在您发帖时,文档中的示例不正确。它已经更新,现在是正确的。
你可以这样写:

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;
});

关于flutter - RiverPod - 如何在不在小部件中的 AsyncValue 上等待使用 FutureProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66411312/

相关文章:

flutter - 如何使用全局 Key 从 Flutter 中的另一个小部件更新小部件状态?

flutter - 无法在此小部件上方找到正确的提供程序 - Flutter

android - 使用 frida 绕过 flutter 应用程序的 Sslpinning 中的空地址

android - 使用唯一标识符flutter/android识别设备

flutter - snackbar 的持续时间和高度

android - Flutterfire 配置无法以任何可能的方式工作

dart - 如何检查用户日期和时间在 flutter 中设置是否正确

android - Flutter audioplayers : How to handle PlatformException(AndroidAudioError, 标有@UiThread的方法必须在主线程执行)

Flutter Riverpod - 使用异步值初始化

firebase - 方法 '[ ]' 在 null 上被调用