Как реализовать работу в фоне во Flutter для отправки данных при возобновлении связи
Что проверяют
Понимаете ли вы, что на Android фоновая работа живёт по правилам системы, а не приложения, и знаете ли правильный инструмент для отложенной отправки. Следом спрашивают, что будет, если пользователь смахнул приложение, и как не отправить одни данные дважды.
Как отвечать
Каркас из трёх частей.
- локальная очередь (outbox): каждый запрос сначала пишется в базу на устройстве (
drift,sqflite) с ключом идемпотентности. Отправка берёт записи по порядку и удаляет их только после успешного ответа, сервер по ключу отбрасывает повторы; - отложенная задача через WorkManager: системный механизм Android, который переживает выгрузку процесса и перезагрузку. Во Flutter к нему даёт доступ плагин
workmanager: регистрируете разовую задачу с ограничением по сети (NetworkType.connected), и система запустит её, когда связь появится, а при неудаче повторит с нарастающей задержкой. Периодические задачи не чаще раза в 15 минут; - быстрый путь в открытом приложении: пока приложение на экране, слушаете
connectivity_plusиAppLifecycleState.resumedи сразу разбираете очередь.
Детали, которые показывают опыт:
- отдельный изолят: колбэк фоновой задачи это функция верхнего уровня с
@pragma('vm:entry-point'). Состояния основного изолята там нет, зависимости и базу нужно инициализировать заново; connectivity_plusне проверяет интернет: он сообщает тип подключения, и Wi-Fi без выхода в сеть выглядит как подключение. С версии 6 поток отдаётList<ConnectivityResult>, а не одно значение;- ограничения системы: Doze и App Standby откладывают задачи, а прошивки некоторых производителей добавляют свои ограничения поверх.
Где спотыкаются
Поднимают foreground service через flutter_background_service ради пары запросов. С Android 14 такой сервис обязан объявить тип, у типа dataSync в Android 15 появился лимит времени работы, а постоянное уведомление раздражает пользователя.
Держат очередь в памяти. Когда система выгрузит процесс, неотправленные данные пропадут.
Удаляют запись из очереди до ответа сервера или не передают ключ идемпотентности. В первом случае данные теряются при обрыве, во втором задваиваются при повторе.