【问题标题】:rxdart filter return a single item from streamrxdart 过滤器从流中返回单个项目
【发布时间】:2020-09-26 19:49:07
【问题描述】:

如何过滤流?我想得到一个uid匹配的记录。返回项必须是流。

import 'dart:async';
import 'package:demo/models/profile.dart';
import 'package:demo/services/database/database.dart';
import 'package:rxdart/rxdart.dart';
import 'bloc_provider.dart';

class SearchResultsBloc implements BlocBase {
  SearchResultsBloc() {
    DatabaseService().Search().listen((data) => _inList.add(data));
  }

  final _listController = BehaviorSubject<List<Profile>>();
  Stream<List<Profile>> get outList => _listController.stream;
  Sink<List<Profile>> get _inList => _listController.sink;

  final _detailsController = BehaviorSubject<Profile>();
  
  Stream<Profile> outDetails(String uid) {
   // return single item  from outList where uid matches.
  }

  @override
  void dispose() {
    _listController.close();
    _detailsController.close();
  }
}

【问题讨论】:

    标签: flutter stream rxdart


    【解决方案1】:

    类似的东西应该可以工作:

      Stream<Profile> outDetails(String uid) {
        return outList.map<Profile>((results) => 
          results.firstWhere((profile) => profile.uid == uid)
        );
      }
    

    基本上,您将配置文件列表流映射到配置文件流,其中,对于每个配置文件列表,您将返回与参数匹配的第一个(可能为 null)配置文件。

    附:不要忘记在调用方正确管理返回的流。


    编辑:如果可能找不到给定uid 的配置文件,则应添加orElse: 参数:

    results.firstWhere(
      (profile) => profile.uid == uid,
      orElse: () => null
    )
    

    这将确保StateError 不会被抛出,以防返回 null 对您来说是正确的。

    【讨论】:

    • firstWhere 可能会在找不到uid 时抛出StateError,我也相信返回null 不是OP 需要的——这就是为什么我会使用expand(或transform ),而不是map
    • 那行得通。太感谢了。 @pskink 您能否提供您的建议的代码示例?现在我需要根据当前的 uid 创建另外两种方法,一种用于上一项,另一种用于下一项,不知道该怎么做。请问有什么建议吗?
    • @Huzzi 如果uid 没有被results.firstWhere 找到应该怎么办?现在它抛出了一个不是你想要的异常?
    • 这也取决于你想在没有 uid 匹配时发生什么。排除空结果的转换将不会产生任何结果。如果您想响应并显示类似No result found 的内容,处理null 的情况很容易。
    • 是的,现在它不会抛出任何异常
    猜你喜欢
    • 1970-01-01
    • 2022-09-12
    • 2021-06-16
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2020-11-02
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多