Мне нужно убедиться, что определенный HTTP-запрос был успешно отправлен.Поэтому мне интересно, существует ли простой способ перенести такой запрос в фоновую задачу службы.
История вопроса заключается в следующем: мы разрабатываем приложение для опросов с использованием флаттера.К сожалению, приложение предназначено для использования в среде, где мобильное интернет-соединение не может быть гарантировано.Поэтому я не могу просто опубликовать результат опроса один раз, но мне нужно повторить его, если он не удастся из-за проблем с сетью.Мой текущий код выглядит следующим образом.Проблема с моим текущим решением состоит в том, что оно работает, только когда приложение активно все время.Если пользователь свернет или закроет приложение, данные, которые я хочу загрузить, будут потеряны.Поэтому я ищу решение, чтобы обернуть процесс загрузки в фоновую задачу службы, чтобы он обрабатывался, даже когда пользователь закрывает приложение.Я нашел несколько постов и плагинов (а именно https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124 и https://pub.dartlang.org/packages/background_fetch), но они не помогают в моем конкретном случае использования. Первый описывает способ, которым приложение может быть уведомлено при наступлении определенного события (а именновозникла геозона), а вторая работает только каждые 15 минут и фокусируется на другом сценарии. Кто-нибудь знает простой способ, как я могу гарантировать, что запрос был обработан, даже если есть плохое подключение к Интернету (или даже нет на данный момент) позволяя пользователям свернуть или даже закрыть приложение?
Future _processUploadQueue() async {
int retryCounter = 0;
Future.doWhile(() {
if(retryCounter == 10){
print('Abborted after 10 tries');
return false;
}
if (_request.uploaded) {
print('Upload ready');
return false;
}
if(! _request.uploaded) {
_networkService.sendRequest(request: _request.entry)
.then((id){
print(id);
setState(() {
_request.uploaded = true;
});
}).catchError((e) {
retryCounter++;
print(e);
});
}
// e ^ retryCounter, min 0 Sec, max 10 minutes
int waitTime = min(max(0, exp(retryCounter)).round(), 600);
print('Waiting $waitTime seconds till next try');
return new Future.delayed(new Duration(seconds: waitTime), () {
print('waited $waitTime seconds');
return true;
});
})
.then(print)
.catchError(print);
}