微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

rxdart过滤器从流返回单个项目

如何解决rxdart过滤器从流返回单个项目

如何过滤流?我想获得一个与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();
  }
}

解决方法

类似的方法应该起作用:

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

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

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


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

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

这将确保不会抛出StateError,以防万一返回null是适合您的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。