Фильтровать поток в список - PullRequest
0 голосов
/ 31 октября 2019

У меня есть следующий построитель потока:

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 - это массив идентификаторов, которым он понравился.

Я пытался удалить карты из списка добавленных в Список карт <> с .where и .contains, но не смог правильнооткажитесь от них. Я думал, что другим вариантом может быть изменение стека напрямую, в

children: cards

с помощью cards.removeWhere / .skip или что-то в этом роде.

Я ценю всю помощь, чтобы узнать, как этого добиться, заранее спасибо!

1 Ответ

0 голосов
/ 01 ноября 2019

Чтобы следовать шаблону блока, бизнес-логика должна происходить в вашем классе блока. Это означает, что вы должны выполнить всю сортировку или фильтрацию в блоке. Когда вы добавляете новый объект в приемник, 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, укажите свой блок, например, как показано ниже:

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

Чтобы понятьподробнее о шаблоне Bloc, это очень полезное руководство, которому вы можете следовать здесь: RxDart Bloc Pattern

...