Flutter中FlutterBlue的stream回调异常未触发onError该如何捕获
异常未被onError捕获的核心原因
Stream.listen 配置的 onError 回调仅能捕获Stream 自身主动发射的错误事件,你代码中抛出的异常来源于 onData 回调内部的异步操作 await device.connect()。由于你传入的 onData 是异步函数,函数内部未捕获的异常属于异步Future异常,不会冒泡到Stream的错误处理链路,因此你定义的onError始终不会触发。
解决方案
方案1:在异步onData内部通过try-catch捕获(推荐)
直接对可能抛出异常的异步操作做单独捕获,还可以针对连接失败的场景做专属业务处理,比如重试、给用户弹出连接失败提示等。
示例代码:
var stream = FlutterBlue.instance.scan(); var sub = stream.listen( (scanResult) async { if (scanResult.device.name == _beacon.id) { device = scanResult.device; try { await device.connect(); // 连接成功后续逻辑 } catch (e) { // 捕获connect方法抛出的所有异常 print("连接失败:$e"); } } }, onError: (error) { // 此处仍可捕获扫描流程自身的错误,比如蓝牙未开启、扫描权限不足等 print("扫描出错:$error"); } );
方案2:为onData异步函数返回的Future附加catchError
如果你需要统一捕获onData内部所有异步逻辑的未处理异常,可以直接给onData函数附加catchError回调:
var stream = FlutterBlue.instance.scan(); var sub = stream.listen( (scanResult) async { if (scanResult.device.name == _beacon.id) { device = scanResult.device; await device.connect(); } }.catchError((e) { print("onData异步逻辑出错:$e"); }), onError: (error) { print("扫描出错:$error"); } );
内容的提问来源于stack exchange,提问作者Scorb
相关产品推荐
相关产品推荐

