приходит в callback.
Возникла необходимость организовать синхронную прием-передачу. Отправляем данные, ждем приема, или выходим по таймауту
Сначала сделал с помощью Future (с await и timeout) и Completer. Примерно так:
Completer<Uint8List> _syncFutureCompleter = Completer();
Future<Uint8List> write(List<int> data) async {
_syncFutureCompleter = Completer();
/*... */
return _syncFutureCompleter.future;
}
void _handleValueChange(
String deviceId, String characteristicId, Uint8List value) {
if (!_syncFutureCompleter.isCompleted) {
_syncFutureCompleter.complete(Uint8List.fromList(value));
}
}
И всё бы хорошо, но встречается проблема, что ответ приходит не целиком за раз, а по частям. То есть в несколько вызовов callback. В результате Completer завершается по первой части данных.
Переделал на отдельный таймер:
List<int> answer = List.empty(growable: true);
late Timer timer;
void _handleValueChange(
String deviceId, String characteristicId, Uint8List value) {
answer.addAll(value);
}
Future<Uint8List> write(List<int> data, Duration timeout) async {
answer.clear();
_syncFutureCompleter = Completer();
timer = Timer(
timeout,
() {
if (!_syncFutureCompleter.isCompleted) {
_syncFutureCompleter.complete(Uint8List.fromList(answer));
}
},
);
/*... */
return _syncFutureCompleter.future;
}
Проблема ушла, но в таком случае всегда приходится ждать весь заданный Duration.
Может есть еще какие нибудь более удобные способы реализовать синхронность? (Кроме как заранее знать длину ответа)
Там известна вся длинна байт аррей:? Тип если лист не заполнен то ждать заполнения и после переход к другой функции
Обсуждают сегодня