flutter - 颤振:StreamBuilder 只构建最后一个快照,产生不产生以前的快照
问题描述
所以我在 Sembast 数据库中缓存了各种记录。
我正在尝试从中检索与 ID 匹配的那些List<String> bookmarkedJobIds
打印日志显示我正在这样做,但是Stream<Job> getBookmarkedJobs()
在提取每条记录后,内部的 for 循环不会产生。for 循环遍历列表中的所有记录,提取它们,然后 yield 只返回最后提取的记录。所以在build
我只得到一张卡。
我不知道这是为什么,或者如何解决它。
@override
void initState() {
initialiseLocalStorage();
jobStream = controller.stream;
controller.addStream(getBookmarkedJobs());
}
Stream<Job> getBookmarkedJobs() async* {
prefs = await SharedPreferences.getInstance();
bookmarkedJobIds = prefs.getStringList("bookmarks");
if (bookmarkedJobIds == null) yield null;
for (String bookmarkedJobId in bookmarkedJobIds) {
Job job = await JobDao().retrieve(bookmarkedJobId);
print('retrieved job, extracting employerName: ${job.employerName}');
yield job;
}
}
@override
Widget build(BuildContext context) {
print('INSIDE BOOKMARKED BUILD');
return StreamBuilder<Job>(
stream: jobStream,
builder: (BuildContext context, AsyncSnapshot<Job> snapshot) {
解决方案
在@pskink 善意关注之后,我已将其转换StreamBuilder
为ListView.builder
,我想使用 Stream 只是为了使我的应用程序保持一致,使 Firebase 处理类似于使用 Sembast 的内部缓存处理,但我认为从设备数据库而不是云中检索更可靠。
使用 ListView 意味着我将我需要的所有数据收集到我的init()
方法中的列表中,然后通过 ListView 将其泵入build
,没有理由相信你会得到任意到达的记录的后续镜头,这是 StreamBuilder 的专长。
经过更多研究,我发现示例应用程序有时有一个父 StreamBuilder,然后将记录 SnapShots 交给子 ListView.builder。所以 ListView 不会像昨天那样笨拙的 Widget 逐渐过时。
推荐阅读
- automation - 无法通过 id 找到控件。SAP GUI 错误?
- vue.js - mocha-webpack - dom 没有更新
- google-apps-script - GS自动前进
- java - 寻求帮助创建 15 分钟的约会,目前硬编码为 1 小时
- r - R: Error in parLapply - $ invalid for atomic vectors only occurs running in parallel
- node.js - How to update a key of object with value in json column with knexjs?
- oracle - What does '%TYPE' mean following a parameter in procedure?
- phpunit - 如何断言数组包含与预期正则表达式匹配的元素?
- css - 设置 div 背景图像不透明度
- numpy - 加速涉及数组切片和广播的numpy代码