如何组合和过滤两个飞镖流



我正在使用flatter_blue作为使用蓝牙的flutter应用程序。

flatter_blue向我展示了两条流:FlutterBlue.instance.connectedDevicesFlutterBlue.instance.scanResults

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

在谷歌上搜索,我得到了rxdart的参考资料,但仍然无法使其发挥作用。请帮忙:(

我想您想要的是Dart异步包中的StreamGroup

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(...),以您想要的方式应用过滤器。

您可以像这样使用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
});

最新更新