当应用程序移至后台状态并再次移至前台状态时,无限列表会导致重复

Posted

技术标签:

【中文标题】当应用程序移至后台状态并再次移至前台状态时,无限列表会导致重复【英文标题】:Infinite List causes duplication when app is moved to background state and again to foreground state 【发布时间】:2019-06-15 14:32:47 【问题描述】:

我正在尝试使用 ListView 构建器从 api 加载一堆名称。 我的api 有一个名为 index 的参数,每次用户到达列表末尾时都需要增加 50 所以我已将ScrollController 附加到我的ListView。 index 开头的值为0。

我首先在initState 中调用api

当用户到达列表末尾时,我的代码如下

 scrollController.addListener(() 
      if (scrollController.position.pixels ==
          scrollController.position.maxScrollExtent) 
        index += 50;

        //Calling the api again here
      
    );

现在使用这种方式可以很好地加载列表。假设用户加载了所有数据,假设索引为 250,现在用户决定 将应用程序置于后台,一段时间后再次打开应用程序,最后 50 个项目再次添加到我的列表中,我不明白为什么。

我正在使用带有bloc 模式的StreamBuilder

if (snapshot.data != null) 
 studentList.addAll(snapshot.data.studentList);

我厌倦了独特的运算符,但它不适用于我的情况

Observable<StudentListModel> get studentList => _studentList.stream.distinct();

【问题讨论】:

【参考方案1】:

我猜这是你的问题。

if (snapshot.data != null) 
  studentList.addAll(snapshot.data.studentList);

您在前 50 个检索到的学生的基础上添加了 100 个学生,其中 50 个是重复的。 您可以将代码更改为:

if (snapshot.data != null) 
  studentList = snapshot.data.studentList;

【讨论】:

如果我重新分配列表而不是将其添加到列表中,那么只要滚动侦听器加载下一个 50 项,前 50 项就会丢失。我需要将它添加到我的列表中。 那么我猜问题是streamBuilder再次调用build并且你无条件地添加到列表中。您可以在学生流上尝试此运算符。 docs.flutter.io/flutter/dart-async/Stream/distinct.html 我尝试了 distinct 运算符,但它没有解决问题

以上是关于当应用程序移至后台状态并再次移至前台状态时,无限列表会导致重复的主要内容,如果未能解决你的问题,请参考以下文章

完成iOS后台任务,将其移至前台

iPhone:当应用程序移至后台时播放声音

SwiftUI DocumentGroup 和切换到后台

TestFlight 外部测试审核状态未更改

如何以编程方式将IAsyncOperation强制为错误状态?

Observable.interval 不在后台状态下工作