如何解决flutter_blue的connect方法无法同步捕获TimeoutException问题
问题解答
1. 是否运行在不同Zone?
不是。connect方法和你的调用代码运行在同一个Zone,异常捕获失败的根因是官方自带的超时逻辑实现错误:Timer的回调是独立调度的异步任务,回调内抛出的异常不会关联到connect方法返回的Future对象,只会进入当前Zone的未捕获异常处理流程,因此外层针对await connect()的try/catch完全无法捕获该异常。
2. 是否无法通过await调用同步判断超时?
依赖官方自带的timeout参数确实无法实现,该参数的实现完全不符合预期:
Timer触发时仅调用了disconnect和抛出未关联到Future的异常,但是源码中await state.firstWhere((s) => s == BluetoothDeviceState.connected)没有设置终止逻辑,如果设备始终无法进入已连接状态,该语句会无限挂起,导致整个connect方法永远不会返回。
修复方案
弃用connect方法自带的timeout参数,使用Dart标准库Future的原生timeout方法包装连接逻辑即可,示例代码如下:
try { // 不传入官方timeout参数,自行控制超时时间 await device.connect(autoConnect: false).timeout(const Duration(seconds: 4)); } on TimeoutException catch (_) { // 捕获超时后主动断开清理状态 await device.disconnect(); print("连接超时"); } catch (e) { // 处理其他连接异常 print("连接错误:$e"); }
内容的提问来源于stack exchange,提问作者Scorb
相关产品推荐
相关产品推荐

