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

Zel*_*elf 16 dart flutter 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;
});
Run Code Online (Sandbox Code Playgroud)

显然,这里缺少一些有关组合提供程序和 AsyncValue 的关键知识,但我正在尝试实现RiverPod 组合提供程序页面上所述的情况,我在其中看到正在使用等待。

在此输入图像描述

Ale*_*ord 27

在您发帖时,文档中的示例不正确。它已被更新,现在是正确的。

你可以这样写:

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;
});
Run Code Online (Sandbox Code Playgroud)

或者:

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;
});
Run Code Online (Sandbox Code Playgroud)


nai*_*ail 20

await可通过以下方式使用:

  • .future关于FutureProvider 文档
  • .last关于StreamProvider 文档

例子

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);
});
Run Code Online (Sandbox Code Playgroud)

目前看来文档包含不正确的代码示例。问题