颤振:StreamBuilder 只构建最后一个快照,不会生成以前的快照



所以我在Sembast数据库中缓存了各种记录。

我正在尝试从List<String> bookmarkedJobIds中检索与 ID 匹配的那些

打印日志显示我正在执行此操作,但是提取每条记录后,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()方法中将我需要的所有数据收集到列表中,然后在build中通过 ListView 将其泵送,没有理由相信您会获得任意到达的记录的后续镜头,这是 StreamBuilder 的专长。

经过更多的研究,我发现示例应用程序有时具有父StreamBuilder,然后将记录SnapShots交给子ListView.builder。 因此,ListView并不像昨天笨拙的小部件逐渐过时。

最新更新