共计 1347 个字符,预计需要花费 4 分钟才能阅读完成。
前言
FlutterBlue
是 Flutter
上最早的蓝牙插件库,为 Flutter App 提供蓝牙交互的能力,次要材料地址:
GitHub: https://github.com/pauldemarc…
Pub: https://pub.dev/packages/flut…
问题
FlutterBlue
的其余局部用起来都很好,代码显得十分易读。然而有一个问题始终随同着 FlutterBlue
的应用,在有的我的项目中,能够疏忽这个问题,在有的我的项目中,这个问题会非常明显的造成逻辑问题,甚至造成整个我的项目呈现问题,那就是 反复收到回调 问题。
详情
以下是 FlutterBlue
文档提供的局部应用办法。
Connect to a device
// Connect to the device
await device.connect();
// Disconnect from device
device.disconnect();
Set notifications and listen to changes
await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {// do something with new value});
如果你手动断开你的设施(断电或敞开蓝牙),再按上述代码连贯,你会发现 // do something with new value
处的代码会反复执行,这个问题十分的辣手,仿佛限流函数都不对此处起作用。
解决
显然问题就产生在 setNotifyValue
。在此处,FlutterBlue
会注册流,而在主动断开时,并不会勾销这个监听,所以,咱们须要手动监听 device 的状态,在断开连接时勾销监听:
_connectListenControl = device.state.listen((BluetoothDeviceState newState) {if (newState == BluetoothDeviceState.disconnected) {
// 勾销之前的监听函数
_notifyListenControl?.cancel();
// 勾销监听
_notify.setNotifyValue(false)
}
},
);
看上去仿佛有一些反直觉:在设施断开后,还须要去操作设施,去勾销设施的监听办法。
只能说这是 FlutterBlue
自身的设计,这个设计的目标可能在于:在复原连贯时,复原之前的监听。很显然通常的业务场景并不会设计复原的操作,而是从新去建设新的连贯,所以就造成了反复监听(因为之前的监听还在)。此时,该当手动开释监听。
结语
这也是一个比拟固执的问题,搞了一年才解决,之前都是放着不管。不过我认为这个问题也可能是多方面的,如果按此办法不能解决这个问题,请在评论区通知我。
作者:马嘉伦
日期:2020/10/16
平台:Segmentfault,勿转载
我的其余文章:
【开发教训】Flutter 组件的事件传递与数据管制
【开发教训】Flutter 防止代码嵌套,写好 build 办法
【Flutter 工具】fmaker: 主动生成倍率切图 / 主动更换 App 图标
【Flutter 工具】可能是 Flutter 上最简略的本地数据保留计划
【Flutter 利用】Flutter 精仿抖音开源