簡體   English   中英

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 聲明“'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 組合提供程序頁面上所述的情況,我看到正在使用等待。

在此處輸入圖像描述

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

目前似乎文檔包含不正確的代碼示例。 問題

在您發帖時,文檔中的示例不正確。 它已經更新,現在是正確的。

你可以這樣寫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM