S

super-dev — full-stack

@super-dev.app · Full-stack · ★ ouvert aux missions
12,8k abonnés·47 vidéos·Actif depuis 2017

Développeur full-stack .NET / Angular avec une casquette DevOps sur Azure Cloud. Aussi à l'aise sur Flutter + Firebase. Je construis des produits, je les déploie, je les surveille.

Retour aux articles
FLUTTER
FLUTTER

Sync offline-first en Flutter + Firebase

Article 1 sur 3 — Flutter en production
Offline-first, Riverpod, monorepo Melos : du mobile sérieux, pas un proto.

Sur mobile, la connectivité n'est jamais acquise : métro, ascenseur, avion. Une app offline-first ne traite pas le hors-ligne comme une erreur, mais comme l'état normal — le réseau n'est qu'une optimisation. Avec Flutter et Firebase, c'est presque gratuit.

Firestore est offline-first par défaut

Le SDK Firestore garde un cache local persistant et sert les lectures depuis ce cache quand le réseau manque. Sur mobile c'est activé par défaut ; on peut le régler explicitement :

Dart
1FirebaseFirestore.instance.settings = const Settings(
2 persistenceEnabled: true,
3 cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED,
4);

Les écritures sont mises en file

Une écriture hors-ligne n'échoue pas : elle rejoint une file d'attente locale, rejouée dès le retour du réseau. L'UI peut afficher la donnée tout de suite (lecture optimiste) grâce au drapeau hasPendingWrites exposé dans les métadonnées du snapshot :

Dart
1stream.listen((snapshot) {
2 final source = snapshot.metadata.hasPendingWrites ? 'local' : 'serveur';
3 // afficher un badge « synchro en cours » tant que source == 'local'
4});

Résoudre les conflits

Deux appareils modifient le même document hors-ligne : qui gagne ? Par défaut, last-write-wins , ce qui peut écraser une donnée. Pour un compteur, on préfère FieldValue.increment() (commutatif, donc sans conflit) ; pour le reste, un updatedAt en FieldValue.serverTimestamp() tranche au moment de la synchro.

  • compteurs → increment()
  • horodatage serveur → serverTimestamp()
  • règle métier complexe → une transaction dans une Cloud Function

Tester le hors-ligne

On ne teste pas l'offline « au feeling » : firestore.disableNetwork() force le mode déconnecté dans un test d'intégration, puis enableNetwork() rejoue la file. Le guide offline Firestore documente chaque API.

L'offline-first, ce n'est pas gérer une panne réseau. C'est concevoir l'app comme si le réseau n'existait pas , et laisser la synchro n'être qu'un détail d'implémentation.
super-dev — portfolio.app
// Continuer dans FLUTTER
Une architecture Flutter testable avec Riverpod
8 min • 2,0k lectures
Monorepo Flutter avec Melos
6 min • 1,2k lectures