FLUTTER:StreamBuilder 只构建最后一个快照,不产生以前的快照
FLUTTER: StreamBuilder only building last Snapshot, yield not yielding previous Snapshots
所以我在 Sembast 数据库中缓存了各种记录。
我正在尝试检索与 List<String> bookmarkedJobIds
中的 ID 匹配的那些
打印日志显示我正在这样做,但是 Stream<Job> getBookmarkedJobs()
中的 for 循环在提取每条记录后没有产生。 for 循环遍历列表中的所有记录,提取它们,然后简单地 returns 提取最后一条记录。所以在 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 不像昨天笨拙的 Widget 一样逐渐过时。
所以我在 Sembast 数据库中缓存了各种记录。
我正在尝试检索与 List<String> bookmarkedJobIds
打印日志显示我正在这样做,但是 Stream<Job> getBookmarkedJobs()
中的 for 循环在提取每条记录后没有产生。 for 循环遍历列表中的所有记录,提取它们,然后简单地 returns 提取最后一条记录。所以在 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 不像昨天笨拙的 Widget 一样逐渐过时。