setCharacteristicNotification method
Future<void>
setCharacteristicNotification({
- required String deviceId,
- required String serviceUuid,
- required String characteristicUuid,
- required bool enable,
override
实现 FlutterBluetoothPluginPlatform.setCharacteristicNotification。
Web 通过 startNotifications/stopNotifications 管理订阅,不直接写 CCCD。
Implementation
@override
Future<void> setCharacteristicNotification({
required String deviceId,
required String serviceUuid,
required String characteristicUuid,
required bool enable,
}) async {
final key = _characteristicKey(deviceId, serviceUuid, characteristicUuid);
final characteristic = await _characteristic(
deviceId: deviceId,
serviceUuid: serviceUuid,
characteristicUuid: characteristicUuid,
);
final existing = _notificationListeners.remove(key);
if (existing != null) {
characteristic.removeEventListener(
'characteristicvaluechanged', existing);
}
if (!enable) {
await characteristic.stopNotifications().toDart;
return;
}
final listener = ((web.Event event) {
final bytes = _bytesFromDataView(characteristic.value);
_characteristicValuesController.add(
BluetoothCharacteristicValue(
deviceId: deviceId,
serviceUuid: serviceUuid,
characteristicUuid: characteristicUuid,
value: bytes,
),
);
}).toJS;
characteristic.addEventListener('characteristicvaluechanged', listener);
_notificationListeners[key] = listener;
try {
await characteristic.startNotifications().toDart;
} catch (_) {
characteristic.removeEventListener(
'characteristicvaluechanged', listener);
_notificationListeners.remove(key);
rethrow;
}
}