【開發經驗】Flutter Blue監聽收到重複數據解決辦法

前言

FlutterBlueFlutter上最先的藍牙插件庫,爲Flutter App提供藍牙交互的能力,主要資料地址:git

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

問題

FlutterBlue的其餘部分用起來都很好,代碼顯得很是易讀。可是有一個問題一直伴隨着FlutterBlue的使用,在有的項目中,能夠忽略這個問題,在有的項目中,這個問題會很是明顯的形成邏輯問題,甚至形成整個項目出現問題,那就是重複收到回調問題。segmentfault

詳情

如下是FlutterBlue文檔提供的部分使用方法。函數

Connect to a device工具

// Connect to the device
await device.connect();

// Disconnect from device
device.disconnect();

Set notifications and listen to changesui

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)
    }
  },
);

看上去彷佛有一些反直覺:在設備斷開後,還須要去操做設備,去取消設備的監聽方法。code

只能說這是FlutterBlue自己的設計,這個設計的目的可能在於:在恢復鏈接時,恢復以前的監聽。很顯然一般的業務場景並不會設計恢復的操做,而是從新去創建新的鏈接,因此就形成了重複監聽(由於以前的監聽還在)。此時,應當手動釋放監聽。事件

結語

這也是一個比較頑固的問題,搞了一年才解決,以前都是放着無論。不過我認爲這個問題也多是多方面的,若是按此方法不能解決這個問題,請在評論區告訴我。

做者:馬嘉倫
日期:2020/10/16
平臺:Segmentfault,勿轉載

個人其餘文章:

【開發經驗】Flutter組件的事件傳遞與數據控制
【開發經驗】Flutter避免代碼嵌套,寫好build方法

【Flutter工具】fmaker:自動生成倍率切圖/自動更換App圖標
【Flutter工具】多是Flutter上最簡單的本地數據保存方案
【Flutter應用】Flutter精仿抖音開源

相關文章
相關標籤/搜索