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 进行缓存,但似乎是一个巨大的过度杀戮 + 不确定它是否足够快。
我想到的下一个方法是在块中创建一个列表,并在发出更多请求时继续向其中添加项目。然后每次都流式传输整个列表。但这意味着为每个流重新创建整个列表,例如第一次请求渲染 1-50,第二次渲染 1-100,第三次渲染 1-150,其中更可取的是 - 第一次渲染 1-50,第二次渲染 51-100并附在第一个渲染下方,等等。
您如何使用 Flutter 实现对应物apollo
和redux
缓存rxdart
?