rxdart 过滤器 return 来自流的单个项目

rxdart filter return a single item from stream

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

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

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

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

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

P.S。不要忘记在调用方正确管理返回的流。


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

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

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