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 对您来说是正确的做法。
如何过滤流?我想获得一个 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 对您来说是正确的做法。