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

问题描述

我需要从 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 Combining Providers 页面上所述的情况,我看到正在使用 await。

enter image description here

解决方法

await 的用法可通过以下方式获得:

示例

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

,

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

你可以这样写:

os.close(html) TypeError: an integer is required (got type str)

或者:

import aiofiles
import glob
from natsort import natsorted
import asyncio
from bs4 import BeautifulSoup
import os

async def main():
    i=0
    htmls = glob.glob("CarsPages" + "//*.html")
    for html in natsorted(htmls):
        async with aiofiles.open(html,mode='r',encoding='UTF-8',errors='strict',buffering=1) as f:
            contents = await f.read()
            soup = BeautifulSoup(contents,features="lxml")
        if "Best portal" in soup.title.get_text():
            i+=1
            os.remove(html)
            print("removed: ",html)
    print("Removed: ",i," pages")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())