Захватить характеристику BLE и присвоить ее переменной в Flutter - PullRequest
0 голосов
/ 11 октября 2019

Мне нужно мгновенно поймать определенное значение характеристики onPress. Поэтому я написал функцию для этого. Проблема в том, что мне пока не удавалось присвоить значение переменной. Как лучше всего решить эту проблему?

Я использую приведенный ниже пример кода flutter_blue: https://pub.dev/packages/flutter_blue#-readme-tab-

Моя функция:

  List<int> _testReadCharacteristic(String uuid) {
    List<int> value;
    device.services.forEach((ls) async {
      //Scans the Liste for all services
      ls.forEach((s) async {
        // Scans the Liste of services for a specific service
        // do something with s
        List<BluetoothCharacteristic> characteristics = s.characteristics;
        for (BluetoothCharacteristic c in characteristics) {
          // Scans all characteristics
          if (c.uuid.toString().toUpperCase().substring(4, 8) == uuid) {
            value = await c.read();
            print('**************** value is: $value');
          }
        }
      });
    });
    return value;
  }

ИКод для кнопки:

        RaisedButton(
          onPressed: () {
           capturedValue = _testReadCharacteristic('1100');
          print('***********The captured Value is: $capturedValue');
          },
          child: const Text('Read Characteristic',
              style: TextStyle(fontSize: 20)),
        ),

Когда я нажимаю кнопку, я получаю отпечаток захваченного значения, которое сначала равно Null. После этого я получаю печать значения, которое является именно тем значением, которое я хочу присвоить capturedValue. Как я могу изменить порядок, чтобы я мог работать с capturedValue?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 октября 2019

Проблема в том, что List.forEach не учитывает / ожидает асинхронные функции. Это означает, что ваша переменная никогда не назначается во времени, а вместо этого возвращается пустой, а затем присваивается после асинхронного завершения чтения.

Вы можете достичь желаемого поведения с помощью преобразования вашего _testReadCharacteristic в метод и синхронизации, а такжеждите в вашем обработчике кнопки onPressed. Кроме того, вам нужно использовать Future.forEach вместо List.forEach, чтобы внешний метод мог ожидать результата:

List<int> _testReadCharacteristic(String uuid) async {
    List<int> value;
    await Future.forEach(device.services.forEach((ls) async {
        //Scans the Liste for all services
        await Future.forEach(ls, (s) async {
        // Scans the Liste of services for a specific service
        // do something with s
        List<BluetoothCharacteristic> characteristics = s.characteristics;
            for (BluetoothCharacteristic c in characteristics) {
                // Scans all characteristics
                if (c.uuid.toString().toUpperCase().substring(4, 8) == uuid) {
                   value = await c.read();
                   print('**************** value is: $value');
                }
            }
        });
    });
    return value;
}

И, наконец, в вашем onPressed

capturedValue = await _testReadCharacteristic('1100');
...