【问题标题】:How to combine and filter two dart Streams如何合并和过滤两个 dart Streams
【发布时间】:2020-02-19 14:22:22
【问题描述】:

我正在使用 flutter_blue 作为一个使用蓝牙的颤振应用程序。

flutter_blue 向我展示了两个流: FlutterBlue.instance.connectedDevices FlutterBlue.instance.scanResults

我想将这两个流合并为一个并应用过滤器。

谷歌搜索我得到了 rxdart 的引用,但我仍然无法让它工作。 请帮忙:)

【问题讨论】:

标签: flutter dart


【解决方案1】:

我想你想要的是来自 Dart 的 async packageStreamGroup

StreamGroup 类将一组流合并为一个输出流。

这应该很简单,您只需获取您的流并使用StreamGroup.merge(...) 方法,传递您想要合并的流列表。看看这个例子:

import 'dart:async' show Stream;
import 'package:async/async.dart' show StreamGroup;

main() async {
  var s1 = stream(10);
  var s2 = stream(20);
  var s3 = StreamGroup.merge([s1, s2]);
  await for(int val in s3) {
    print(val);
  }
}

Stream<int> stream(int min) async* {
  int i = min;
  while(i < min + 3) {
    yield i++;
  }
}

将打印:

10
20
11
21
12
22

合并它们后,您可以使用标准的Stream 方法,例如map(...),以您想要的方式应用您的过滤器。

【讨论】:

    【解决方案2】:

    你可以像这样使用 Rx.combineLatest2:

    class CombinedResult {
      final List<BluetoothDevice> connectedDevices;
      final List<ScanResult> scanResults;
    
      CombinedResult(this.connectedDevices, this.scanResults);
    }
    
    final filteredStream = Rx.combineLatest2<List<BluetoothDevice>, List<ScanResult>, CombinedResult>(
      FlutterBlue.instance.connectedDevices, 
      FlutterBlue.instance.scanResults,
      (devices, scanResults) => CombinedResult(connectedDevices, scanResults),
    ).where((combinedResult) {
      return true; //do your filtering here
    });
    

    【讨论】:

    • 嗨。我不确定 CombineResult 是正确的函数。在东方,不是我理解的它的功能。
    • 嗨,CombinedResult 只是我创建的一个 Wrapper 类,用于将第一个流中的 connectedDevices 和第二个流中的 scanResults 存储在单个对象中。然后,在过滤器功能中,您可以使用 combinedResult.connectedDevices 和 combinedResult.scanResults 进行过滤。
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2022-01-15
    • 2021-02-17
    • 2014-03-16
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多