Невозможно использовать плагин flutter_reactive_ble внутри Workmanager
Недавно я пытаюсь подключить свое приложение Flutter к устройству Arduino через BLE. Я использую плагин flutter_reactive_ble для обработки BLE-соединения и использую плагин workmanager для обработки периодической задачи в фоновом режиме. Ставлю BLE сканирование и соединение в диспетчере обратного вызова. После инициализации FlutterReactiveBle в диспетчере обратного вызова я могу получить обновленный статус BLE. Статус неизвестен.
Однако остальная часть кода BLE, похоже, не работает, потому что ни один из операторов печати не выполняется в блоке. Кажется, что workmanager прогоняет коды, не дожидаясь, пока функции просканируют и подключатся. Как я могу исправить эту проблему? Я застрял на несколько дней.
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
switch (task) {
case simplePeriodicTask:
Uuid serviceID = Uuid.parse('1101');
Uuid characteristicsID = Uuid.parse('2101');
final FlutterReactiveBle _ble = FlutterReactiveBle();
StreamSubscription? _subscription;
StreamSubscription<ConnectionStateUpdate>? _connection;
void _disconnect() async {
if (_subscription != null) {
_subscription!.cancel();
}
}
Future<void> _connectBLE() async {
print(_ble.status);
_subscription = _ble.scanForDevices(
withServices: [serviceID],
scanMode: ScanMode.lowLatency,
requireLocationServicesEnabled: false).listen((device) {
print(device.name);
if (device.name == 'PersonDetection') {
print('PersonDetection found!');
_connection = _ble
.connectToDevice(
id: device.id,
connectionTimeout: const Duration(seconds: 5),
)
.listen((connectionState) async {
// Handle connection state updates
print(device.name);
print(device.id);
print('connection state:');
print(connectionState.connectionState);
if (connectionState.connectionState ==
DeviceConnectionState.connected) {
final characteristic = QualifiedCharacteristic(
serviceId: serviceID,
characteristicId: characteristicsID,
deviceId: device.id);
final response = await _ble.readCharacteristic(characteristic);
print(response);
_disconnect();
print('disconnected');
}
}, onError: (dynamic error) {
// Handle a possible error
print(error.toString());
});
}
}, onError: (error) {
print('error!');
print(error.toString());
});
}
_connectBLE();
break;
}
return Future.value(true);
});
}