dart - 如何在抖动中缓存rxdart流以实现无限滚动

标签 dart flutter rxdart

class PollScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    bloc.paginatePolls(null, null);

    return StreamBuilder(
        stream: bloc.polls,
        builder: (context, AsyncSnapshot<List<PollModel>> snapshot) {
          if (snapshot.data == null || snapshot.data.length < 1) {
            return Text('loading...');
          }

          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (context, int index) {
              final PollModel curItem = snapshot.data[index];

              return Card(
                   //Render Logic
                );
            },
          );
        });
  }
}

class Bloc {
  final Repository _repository = Repository();
  final PublishSubject<List<PollModel>> _polls = PublishSubject<List<PollModel>>();

  Observable<List<PollModel>> get polls => _polls.stream;

  paginatePolls(int count, String last) async {
    final List<PollModel> polls = await _repository.paginatePolls(count, last);

    _polls.sink.add(polls);
  }

  dispose(){
    _polls.close();
  }
}
final bloc = Bloc();

就移动开发而言,我来自react native背景,并且我使用过apolloredux等工具,因此rxdart有点让我感到困惑。 paginatePolls只是从服务器检索对象的简单列表,并将其添加到流中,并且PollScreen类正在呈现结果。一切正常,但我很好奇如何缓存第一个paginatePolls请求,以便可以使用count(要返回的文档数)进行后续查询,并使用last(从上一结果返回的最后一个项目的ID)并将结果附加到后面已经在那里。

apolloredux中,当我发出更多请求时,我只会向缓存中添加越来越多的文档,但是由于rxdart是流,因此我不确定哪种方法最有效。

我曾考虑过使用sqlite进行缓存,但似乎是一个巨大的杀戮+不确定它是否足够快。

我想到的下一个方法就是在整体中创建一个列表,并在发出更多请求时继续向其中添加项目。然后每次流式传输整个列表。但这意味着要为每个流重新创建整个列表,例如第一请求渲染1-50,第二渲染1-100,第三渲染1-150,其中最好是-第一渲染1-50,第二渲染51-100并仅附着在第一渲染下方,依此类推。

如何使用apollo在flutter中实现reduxrxdart缓存的副本?

最佳答案

我一直陷在这个类似的问题上。我当时正在考虑将Map保留在我的存储库(您在其中发出网络请求的类)中,然后从那里进行查找。但是我对此有疑问,因为我使用的是“计算”方法,而传递给“计算”函数的任何内容都不能是实例方法。 (https://flutter.dev/docs/cookbook/networking/background-parsing)

我在网上看了看,也有人建议不要使用global bloc,我也来自React Native + Redux背景,但是我真的想以正确的方式使用bloc模式,希望那里有更好的示例。

关于dart - 如何在抖动中缓存rxdart流以实现无限滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55244799/

相关文章:

dart - 具有自动完成功能的 Polymer/Dart 输入

dart - 如何在 flutter 中做 widget 的下拉动画?

dart - StreamBuilder TextField 在其他地方更改时不会更新其值

dart - 无法收听广播流

flutter - Intellisense未在Dart/Flutter的VSCode中触发

flutter - 轻而易举地打印报表

class - 定义类的要点

flutter - 当前的 Dart SDK 版本是 2.10.4。如何将版本更改为高版本。?在测试版或开发 channel 中

dart - 如何根据第一个流中的事件初始化第二个流?

flutter - 如何在 Streambuilder 中获取 Api 数据 - Flutter