FlutterBlue
是Flutter
上最先的藍牙插件庫,爲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精仿抖音開源