目前踩到的坑是:
只是普通取消蓝牙的订阅并不能正确全部取消, 当再次连接蓝牙和订阅后, 每次发送,会给我回2次订阅消息,说明之前的取消订阅并没有正确取消,依次类推,会导致代码崩溃.
下面是我能正确关闭这个flutter_blue_plus插件订阅流的代码,仅供参考, 有不同意见欢迎指正
// 创建一个流的List,用于存储订阅回调变量
List<StreamSubscription<List<int>>> subscriptions = [];
Future<void> subscribeCharacteristics(List<BluetoothService> services) async {
//for循环检测所有uuid,有可订阅的特征就订阅
for (BluetoothService service in services) {
for (BluetoothCharacteristic characteristic in service.characteristics) {
if (characteristic.properties.notify ||
characteristic.properties.indicate) {
// 设置订阅通知或指示
await characteristic.setNotifyValue(true);
debugPrint('订阅特征');
// 创建一个接收订阅回调的变量,并将其添加到流的List中
StreamSubscription<List<int>> subscription =
characteristic.lastValueStream.listen((data) async {
subscribeCBack(characteristic, data, services);
});
//把这个订阅回调的变量添加到流的List中
subscriptions.add(subscription);
}
}
}
}
// 在断开连接时取消订阅
void cancelSubscriptions() {
for (var subscription in subscriptions) {
subscription.cancel();
}
subscriptions.clear();
}
取消思路在代码中:
- 先创建一个流的List
- 再把订阅的回调变量添加到 流的List
- 最后在cancelSubscriptions()函数里面先cancel回调变量值,最后清空流的List