setCharacteristicNotification method

  1. @override
Future<void> setCharacteristicNotification({
  1. required String deviceId,
  2. required String serviceUuid,
  3. required String characteristicUuid,
  4. 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;
  }
}