Отфильтровать поток в список

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

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 или что-то в этом роде.


person itslucca    schedule 31.10.2019    source источник


Ответы (1)


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

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

Когда вы создаете свой стримбордер, укажите на свой блок, например, как показано ниже:

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

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

person xion    schedule 01.11.2019
comment
Спасибо за ответ. Но как мне объединить результаты, чтобы отфильтровать эти исключения? Как getResults (весь список) без getResultsLikedByMe и getResultsOwnerIsMe? Спасибо! - person itslucca; 03.11.2019
comment
1. создать API, который возвращает только эти значения, например, getResultOwnerIsNotMeAndNotLikedByMe, это должно быть сделано на уровне API. 2. получить список из getResults и добавить отфильтрованное / отображенное значение в приемник. [список дротиков для каждого] (codeburst.io/) - person xion; 03.11.2019