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
背景,并且我使用过apollo
和redux
之类的工具,因此rxdart
令我有些困惑。 paginatePolls
只是从服务器检索对象的简单列表,并将其添加到流中,而PollScreen
类正在呈现结果。一切正常,但我很好奇如何缓存第一个paginatePolls
请求,以便可以使用count
(要返回的文档数)last
(最后一项的ID)进行后续查询从先前的结果返回),只需将结果附加到已经存在的地方即可。
在apollo
和redux
中,随着我发出更多请求,我只会向缓存中添加越来越多的文档,但是由于rxdart
是流,因此我不确定哪种方法是最有效的。
我曾经考虑过使用sqlite进行缓存,但似乎是一个巨大的杀戮+不确定它是否足够快。
我想到的下一个方法就是在bloc中创建一个列表,并在发出更多请求时继续向其中添加项目。然后每次流式传输整个列表。但这将意味着为每个流重新创建整个列表,例如第一个请求渲染1-50,第二个渲染1-100,第三个渲染1-150,最好是-第一个渲染1-50,第二个渲染51-100,然后附加在第一个渲染下方,等等。
如何使用apollo
在抖动中实现redux
和rxdart
缓存的副本?
答案 0 :(得分:0)
我一直在解决类似问题。我当时正在考虑将Map保留在我的存储库(您在其中发出网络请求的类)中,然后从那里进行查找。但是我遇到了问题,因为我使用的是“计算”方法,而传递给“计算”函数的任何内容都不能是实例方法。 (https://flutter.dev/docs/cookbook/networking/background-parsing)
我在网上看了看,有人建议不要使用global bloc
,我也来自React Native + Redux背景,但是我真的想以正确的方式使用bloc模式,希望有更好的例子在那里。