乐趣区

关于前端:开发经验Flutter-Blue监听收到重复数据解决办法

前言

FlutterBlueFlutter 上最早的蓝牙插件库,为 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 精仿抖音开源

退出移动版