Prima o poi ogni app seria deve fare qualcosa quando non è in primo piano: sincronizzare ordini, caricare log, ripulire cache, scaricare contenuti. Su Android e iOS non basta un Timer: il processo viene ucciso, l'app viene messa in doze e il sistema decide quando farti girare.
Il pacchetto workmanager è un ponte verso le API native di scheduling: WorkManager/JobScheduler su Android e BGTaskScheduler / Background Fetch su iOS. Il codice Dart viene eseguito in un isolate separato, senza albero dei widget, senza BuildContext, senza i tuoi singleton già inizializzati.
In questo tutorial avanzato costruiamo una pipeline di sincronizzazione completa:
- registrazione dell'entrypoint di background con
@pragma('vm:entry-point'); - inizializzazione dei plugin dentro l'isolate (
DartPluginRegistrant); - task one-off e periodici con vincoli (rete, batteria, carica) e backoff esponenziale;
- logica idempotente con lease/lock per evitare doppie esecuzioni;
- comunicazione dei risultati alla UI (SharedPreferences +
IsolateNameServer+ notifica locale); - configurazione iOS e strumenti per forzare l'esecuzione in fase di test.
Prerequisiti: buona confidenza con async/await, isolate e configurazione nativa Android/iOS.