如何在 flutter 中缓存 rxdart 流以实现无限滚动
How to cache rxdart streams in flutter for infinite scroll
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
class 正在呈现结果。一切正常,但我很好奇如何缓存第一个 paginatePolls
请求,以便我可以使用 count
进行后续查询(return 的文档数)last
(id最后一项 return 从以前的结果编辑)并简单地将结果附加到已经存在的内容上。
在 apollo
和 redux
中,我会在发出更多请求时将越来越多的文档添加到缓存中,但由于 rxdart
是一个流,我不确定是哪个方法是最有效的。
我考虑过使用 sqlite 进行缓存,但似乎太过分了 + 不确定它是否足够快。
我想到的下一个方法是在 bloc 中创建一个列表,并在发出更多请求时不断向其中添加项目。然后每次都流式传输整个列表。但这意味着为每个流重新创建整个列表,例如第一个请求渲染 1-50,第二个渲染 1-100,第三个渲染 1-150,其中更可取的是 - 第一个渲染 1-50,第二个渲染 51-100,然后附加在第一个渲染下面,等等
如何使用 rxdart
在 flutter 中实现 apollo
和 redux
缓存的对应项?
我一直被困在这个类似的问题上。我正在考虑在我的存储库中保留一个地图(class,您在其中发出网络请求),然后从那里在地图中查找。但是我对此有疑问,因为我使用了 "compute" 方法,无论您传递给 "compute" 函数的什么都不能是实例方法。 (https://flutter.dev/docs/cookbook/networking/background-parsing)
我在网上看了一些人反对 global bloc
,我也有 React Native + Redux 的背景,但我真的很想以正确的方式使用 bloc 模式,希望有更好的那里的例子。
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
class 正在呈现结果。一切正常,但我很好奇如何缓存第一个 paginatePolls
请求,以便我可以使用 count
进行后续查询(return 的文档数)last
(id最后一项 return 从以前的结果编辑)并简单地将结果附加到已经存在的内容上。
在 apollo
和 redux
中,我会在发出更多请求时将越来越多的文档添加到缓存中,但由于 rxdart
是一个流,我不确定是哪个方法是最有效的。
我考虑过使用 sqlite 进行缓存,但似乎太过分了 + 不确定它是否足够快。
我想到的下一个方法是在 bloc 中创建一个列表,并在发出更多请求时不断向其中添加项目。然后每次都流式传输整个列表。但这意味着为每个流重新创建整个列表,例如第一个请求渲染 1-50,第二个渲染 1-100,第三个渲染 1-150,其中更可取的是 - 第一个渲染 1-50,第二个渲染 51-100,然后附加在第一个渲染下面,等等
如何使用 rxdart
在 flutter 中实现 apollo
和 redux
缓存的对应项?
我一直被困在这个类似的问题上。我正在考虑在我的存储库中保留一个地图(class,您在其中发出网络请求),然后从那里在地图中查找。但是我对此有疑问,因为我使用了 "compute" 方法,无论您传递给 "compute" 函数的什么都不能是实例方法。 (https://flutter.dev/docs/cookbook/networking/background-parsing)
我在网上看了一些人反对 global bloc
,我也有 React Native + Redux 的背景,但我真的很想以正确的方式使用 bloc 模式,希望有更好的那里的例子。