如何解决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 举报,一经查实,本站将立刻删除。