Dart 如何将多个数据流组合在一个组中?
我有一个小部件来表示按离用户最近的位置排序的商店列表,也应该应用过滤 数据来源:Dart 如何将多个数据流组合在一个组中?,dart,stream,flutter,Dart,Stream,Flutter,我有一个小部件来表示按离用户最近的位置排序的商店列表,也应该应用过滤 数据来源: 存储来自Firestore集合流的数据 geolacator中的当前用户位置 从共享首选项筛选选项 (可随时更改) 列出用户选择的排序模式 数据输出:筛选、排序、存储列表 在这种情况下,什么样的模式是最佳实践?数字2、3和4是通过接收器发送到bloc的输入。bloc监听这些接收器并相应地更新Firestore查询。仅此一项就足以使Firestore将适当的快照发送到小部件正在侦听的输出流 如果您不能直接使用Fire
在这种情况下,什么样的模式是最佳实践?数字2、3和4是通过接收器发送到bloc的输入。bloc监听这些接收器并相应地更新Firestore查询。仅此一项就足以使Firestore将适当的快照发送到小部件正在侦听的输出流 如果您不能直接使用Firestore的API进行排序或筛选,您可以使用或应用一个新的API。transformer为您提供了很大的灵活性,可以通过实现其方法动态地侦听流并更改或忽略事件 因此,您可以执行以下操作:
Stream get stores=>\u firestoreStream
.transform(过滤器)
.变换(排序);
一般来说,请查看dart中的流,并查看更复杂的流操作。根据个人经验,我发现一个块有多个输入导致代码难以测试。块内的隐式并发问题会导致混乱的场景 我在帖子中构建它的方法是创建一个单一的输入流,但在消息中添加标记,表示消息是哪个数据流的一部分。它使测试变得正常。rxdart: 如果您想将数据组合在一起,可以使用
var myObservable = Observable.combineLatest3(
myFirstStream,
mySecondStream,
myThirdStream,
(firstData, secondData, thirdData) => print("$firstData $secondData $thirdData"));
you can combine from ( combineLatest2, combineLatest... combineLatest9 )
或
组合相关流
比如这个例子
CombineLatestStream.list<String>([
Stream.fromIterable(["a"]),
Stream.fromIterable(["b"]),
Stream.fromIterable(["C", "D"])])
.listen(print);
CombineLatestStream.list([
Stream.fromIterable([“a”]),
Stream.fromIterable([“b”]),
Stream.fromIterable([“C”,“D”]))
.听(打印);
在这种情况下,我认为存在多个异步处理。这种实现可能很复杂。还有一种可能是种族状况
我将执行以下步骤
import 'dart:async';
import 'package:rxdart/rxdart.dart';
class ViewModel {}
class DataFromFirestoreModel {}
abstract class UserControl {}
class UserRequest extends UserControl {}
class UserFilter extends UserControl {
final String keyWord;
UserFilter(this.keyWord);
}
enum SortType { ascending, descending }
class UserSort extends UserControl {
final SortType sortType;
UserSort(this.sortType);
}
class Bloc {
final controller = StreamController<UserControl>();
final viewModel = BehaviorSubject<ViewModel>();
final collection = StreamController<DataFromFirestoreModel>();
Bloc() {
controller.stream.listen(_handleControl);
}
_handleControl(UserControl control) {
if (control is UserRequest) {
_handleRequest();
} else if (control is UserFilter) {
handleFilter(control.keyWord);
} else if (control is UserSort) {
handleSort(control.sortType);
}
}
_handleRequest() {
//get location
//get data from sharedPreferences
//get data from firestore
ViewModel modifiedViewModel; // input modifiedViewModel
viewModel.add(modifiedViewModel);
}
handleSort(SortType sortType) {
final oldViewModel = viewModel.value;
//sorting oldViewModel
ViewModel newViewModel; // input sorted oldViewModel
viewModel.add(newViewModel);
}
handleFilter(String keyWord) {
//store data to sharedPreferences
//get data from Firestore
ViewModel modifiedViewModel; // input modifiedViewModel
viewModel.add(modifiedViewModel);
}
}
导入'dart:async';
导入“包:rxdart/rxdart.dart”;
类ViewModel{}
类DataFromFirestoreModel{}
抽象类UserControl{}
类UserRequest扩展UserControl{}
类UserFilter扩展了UserControl{
最后一个字符串关键字;
UserFilter(this.keyWord);
}
枚举排序类型{升序,降序}
类UserSort扩展了UserControl{
最终排序类型排序类型;
UserSort(this.sortType);
}
阶级集团{
最终控制器=StreamController();
最终视图模型=行为主体();
最终集合=StreamController();
集团(){
controller.stream.listen(_handleControl);
}
_handleControl(用户控制){
if(控件为UserRequest){
_HandlerRequest();
}else if(控件为UserFilter){
handleFilter(control.keyWord);
}else if(控件为UserSort){
handleSort(control.sortType);
}
}
_HandlerRequest(){
//获取位置
//从SharedReferences获取数据
//从firestore获取数据
ViewModel modifiedViewModel;//输入modifiedViewModel
添加(修改的视图模型);
}
handleSort(SortType SortType){
最终oldViewModel=viewModel.value;
//排序oldViewModel
ViewModel newViewModel;//输入排序的旧ViewModel
添加(newViewModel);
}
handleFilter(字符串关键字){
//将数据存储到SharedReferences
//从Firestore获取数据
ViewModel modifiedViewModel;//输入modifiedViewModel
添加(修改的视图模型);
}
}