【问题标题】:Filter Stream to List过滤流到列表
【发布时间】:2020-02-26 22:16:37
【问题描述】:

我有以下流生成器:

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)
  • 我喜欢这张卡片('liked.' contains = currentUserId)

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

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

children: cards

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

【问题讨论】:

    标签: flutter dart google-cloud-firestore stream-builder


    【解决方案1】:

    要遵循 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

    【讨论】:

    • 感谢您的回答。但是我将如何结合结果来过滤掉这些异常呢?像 getResults(整个列表)一样,减去 getResultsLikedByMe 和 getResultsOwnerIsMe?谢谢!
    • 1.创建一个只返回这些值的 API,例如 getResultOwnerIsNotMeAndNotLikedByMe,这应该在 API 级别完成。 2. 从 getResults 中获取列表并将过滤/映射的值添加到 sink。 [飞镖列表 foreach] (codeburst.io/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多