我想在我的应用程序中使用flutter block模式。它使用quick_blue库来扫描BLE设备。QuickBlue提供扫描结果流。我的目标是用一个事件开始扫描(每次发现设备时发出新状态),用另一个事件停止扫描。
问题:我不清楚如何取消活动的扫描事件。由于 * scanResultStream * 来自第三方库,我无法控制它。因此,emit.onEach保持活动状态,直到另一个 * StartScanEvent * 触发(感谢 * restartable()*)。
我看过flutter block与流example,但流是在应用程序内部创建的,所以用户可以完全控制它。我很感激你的建议。
这是我的区块代码:
class BLEBloc extends Bloc<BLEEvent, BLEState> {
final List<BlueScanResult> scanResult = [];
final Stream scanStream = QuickBlue.scanResultStream;
BLEBloc() : super(BLEInitState()) {
on<StartScanEvent>((event, emit) async {
QuickBlue.startScan();
scanResult.clear();
// want to cancel this
await emit.onEach(
scanStream,
onData: (data) {
scanResult.add(data);
emit(DeviceFoundState(scanResult));
},
);
print("finished"); // finishes only on next StartScanEvent
}, transformer: restartable());
on<StopScanEvent>(
(event, emit) {
QuickBlue.stopScan();
emit(ScanFinishedState());
},
);
}
}
1条答案
按热度按时间kgsdhlau1#
我建议使用
Stream.listen
,这样你就可以随时取消订阅。