前言

FlutterBlueFlutter上最早的蓝牙插件库,为Flutter App提供蓝牙交互的能力,次要材料地址:

GitHub: https://github.com/pauldemarc...
Pub: https://pub.dev/packages/flut...

问题

FlutterBlue的其余局部用起来都很好,代码显得十分易读。然而有一个问题始终随同着FlutterBlue的应用,在有的我的项目中,能够疏忽这个问题,在有的我的项目中,这个问题会非常明显的造成逻辑问题,甚至造成整个我的项目呈现问题,那就是反复收到回调问题。

详情

以下是FlutterBlue文档提供的局部应用办法。

Connect to a device

// Connect to the deviceawait device.connect();// Disconnect from devicedevice.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精仿抖音开源