问题描述
我需要从 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。
解决方法
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
,文档中的示例在您发帖时不正确。它已经更新,现在是正确的。
你可以这样写:
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())