【发布时间】:2020-02-19 14:22:22
【问题描述】:
我正在使用 flutter_blue 作为一个使用蓝牙的颤振应用程序。
flutter_blue 向我展示了两个流: FlutterBlue.instance.connectedDevices FlutterBlue.instance.scanResults
我想将这两个流合并为一个并应用过滤器。
谷歌搜索我得到了 rxdart 的引用,但我仍然无法让它工作。 请帮忙:)
【问题讨论】:
我正在使用 flutter_blue 作为一个使用蓝牙的颤振应用程序。
flutter_blue 向我展示了两个流: FlutterBlue.instance.connectedDevices FlutterBlue.instance.scanResults
我想将这两个流合并为一个并应用过滤器。
谷歌搜索我得到了 rxdart 的引用,但我仍然无法让它工作。 请帮忙:)
【问题讨论】:
我想你想要的是来自 Dart 的 async package 的 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
});
【讨论】: