Dart 如何将多个数据流组合在一个组中?

Dart 如何将多个数据流组合在一个组中?,dart,stream,flutter,Dart,Stream,Flutter,我有一个小部件来表示按离用户最近的位置排序的商店列表,也应该应用过滤 数据来源: 存储来自Firestore集合流的数据 geolacator中的当前用户位置 从共享首选项筛选选项 (可随时更改) 列出用户选择的排序模式 数据输出:筛选、排序、存储列表 在这种情况下,什么样的模式是最佳实践?数字2、3和4是通过接收器发送到bloc的输入。bloc监听这些接收器并相应地更新Firestore查询。仅此一项就足以使Firestore将适当的快照发送到小部件正在侦听的输出流 如果您不能直接使用Fire

我有一个小部件来表示按离用户最近的位置排序的商店列表,也应该应用过滤

数据来源:

  • 存储来自Firestore集合流的数据
  • geolacator中的当前用户位置
  • 从共享首选项筛选选项 (可随时更改)
  • 列出用户选择的排序模式
  • 数据输出:筛选、排序、存储列表


    在这种情况下,什么样的模式是最佳实践?

    数字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”]))
    .听(打印);
    
    在这种情况下,我认为存在多个异步处理。这种实现可能很复杂。还有一种可能是种族状况

    我将执行以下步骤

  • 将模型流从Firestore和用户可见的ViewModel中分离出来。小部件只侦听ViewModel(例如,使用StreamBuilder)
  • 仅在集团中限制业务逻辑处理。首先,将带有SharedReference的处理重新定位到Bloc中
  • 仅为用户输入创建UserControl类
  • 分支处理取决于扩展UserControl的用户输入类型
  • 我希望这对你有帮助

    例如:

    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
    添加(修改的视图模型);
    }
    }