颤振:StreamBuilder仅构建最后一个快照,产生不产生先前的快照

时间:2020-07-03 15:50:49

标签: flutter stream yield

所以我在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) {

1 个答案:

答案 0 :(得分:0)

经过@pskink的关注之后,我将StreamBuilder转换为ListView.builder,我想使用Stream只是为了使我的应用程序保持一致,使Firebase处理类似于使用Sembast进行的内部缓存处理,但我认为从设备数据库而不是云中检索更为可靠。

使用ListView意味着我将所有需要的数据收集到了init()方法中的列表中,然后将其通过build中的ListView进行了泵送,没有理由相信您将获得后续的支持任意到达的记录快照,这是StreamBuilder的专长。

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