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 一样逐渐过时。