0

我有以下流生成器:

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,
            );

在以下情况下,我需要过滤某些卡片以使其不被添加到流/显示中:

  • 我是卡的所有者('ownerId' == currentUserId)
  • 我喜欢这张卡片(“喜欢。”包含 = currentUserId)

OwnerId 是每个文档中的一个字段, Liked 是一个包含喜欢它的 Id 的数组。

我尝试使用 .where 和 .contains 将卡片从添加到卡片 List<> 中删除,但无法正确“丢弃”它们。我在想另一种选择可能是直接修改堆栈,在

children: cards

使用cards.removeWhere/.skip,或类似的东西。

4

1 回答 1

0

要遵循 bloc 模式,业务逻辑应该发生在您的 bloc 类中。这意味着您应该在集团中进行所有排序或过滤。当您将新对象添加到 sink 中时,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();

当你构建你的流构建器时,指向你的 Bloc,例如如下:

body: StreamBuilder<List<String>>(
stream: blaBloc.results,
builder: (context, AsyncSnapshot<RecipesResponse> snapshot) {
// build your list here...
}
)

要了解有关 Bloc 模式的更多信息,这是一个非常有用的教程,您可以在此处学习:RxDart Bloc Pattern

于 2019-11-01T12:38:30.120 回答