过滤流列表
Filter Stream to List
我有以下流生成器:
streamCard() {
return StreamBuilder(
stream: cardsRef
.orderBy("timestamp", descending: true)
.limit(10)
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return circularProgress();
}
List<CustomCard> cards = [];
snapshot.data.documents.forEach((doc) {
cards.add(CustomCard.fromDocument(doc));
});
...
return Stack(
alignment: Alignment.center,
children: cards,
);
在以下情况下,我需要过滤某些卡片以防止添加到 stream/displayed:
- 我是卡的所有者('ownerId' == currentUserId)
- 我喜欢这张卡片('liked.' 包含 = currentUserId)
OwnerId 是每个文档中的一个字段,Liked 是一个包含喜欢它的 Id 的数组。
我尝试使用 .where 和 .contains 将卡片从添加到卡片列表 <> 中删除,但无法正确 'discard' 它们。我在想另一种选择是在
中直接修改 Stack
children: cards
with cards.removeWhere/.skip,或类似的东西。
要遵循 bloc 模式,业务逻辑应该发生在您的 bloc class 中。这意味着您应该在 bloc 中进行所有排序或过滤。当您将新对象添加到接收器时,streambuilder 将重建。
class BlaBloc {
final BehaviorSubject<List<String>> _results =
BehaviorSubject<List<String>>();
getResults() {
List<String> yourresults = yourapi.getResults();
_results.sink.add(yourresults);
};
getResultsLikedByMe() {
List<String> yourresults = yourapi.getResultsLikedByMe();
_results.sink.add(yourresults);
}
getResultsOwnerIsMe() {
List<String> yourresults = yourapi.getResultsOwnerIsMe();
_results.sink.add(yourresults);
}
BehaviorSubject<List<String>> get results => _results;
}
final blaBloc = BlaBloc();
当你建立你的streambuilder时,指向你的Bloc,例如如下:
body: StreamBuilder<List<String>>(
stream: blaBloc.results,
builder: (context, AsyncSnapshot<RecipesResponse> snapshot) {
// build your list here...
}
)
要了解有关 Bloc 模式的更多信息,您可以在此处阅读非常有用的教程:RxDart Bloc Pattern
我有以下流生成器:
streamCard() {
return StreamBuilder(
stream: cardsRef
.orderBy("timestamp", descending: true)
.limit(10)
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return circularProgress();
}
List<CustomCard> cards = [];
snapshot.data.documents.forEach((doc) {
cards.add(CustomCard.fromDocument(doc));
});
...
return Stack(
alignment: Alignment.center,
children: cards,
);
在以下情况下,我需要过滤某些卡片以防止添加到 stream/displayed:
- 我是卡的所有者('ownerId' == currentUserId)
- 我喜欢这张卡片('liked.' 包含 = currentUserId)
OwnerId 是每个文档中的一个字段,Liked 是一个包含喜欢它的 Id 的数组。
我尝试使用 .where 和 .contains 将卡片从添加到卡片列表 <> 中删除,但无法正确 'discard' 它们。我在想另一种选择是在
中直接修改 Stackchildren: cards
with cards.removeWhere/.skip,或类似的东西。
要遵循 bloc 模式,业务逻辑应该发生在您的 bloc class 中。这意味着您应该在 bloc 中进行所有排序或过滤。当您将新对象添加到接收器时,streambuilder 将重建。
class BlaBloc {
final BehaviorSubject<List<String>> _results =
BehaviorSubject<List<String>>();
getResults() {
List<String> yourresults = yourapi.getResults();
_results.sink.add(yourresults);
};
getResultsLikedByMe() {
List<String> yourresults = yourapi.getResultsLikedByMe();
_results.sink.add(yourresults);
}
getResultsOwnerIsMe() {
List<String> yourresults = yourapi.getResultsOwnerIsMe();
_results.sink.add(yourresults);
}
BehaviorSubject<List<String>> get results => _results;
}
final blaBloc = BlaBloc();
当你建立你的streambuilder时,指向你的Bloc,例如如下:
body: StreamBuilder<List<String>>(
stream: blaBloc.results,
builder: (context, AsyncSnapshot<RecipesResponse> snapshot) {
// build your list here...
}
)
要了解有关 Bloc 模式的更多信息,您可以在此处阅读非常有用的教程:RxDart Bloc Pattern