S

super-dev — full-stack

@super-dev.app · Full-stack · ★ disponible para proyectos
12,8k suscriptores·47 vídeos·Activo desde 2017

Desarrollador full-stack .NET / Angular con perfil DevOps en Azure Cloud. También cómodo con Flutter + Firebase. Construyo productos, los despliego, los monitorizo.

Volver a los artículos
FLUTTER
FLUTTER

Sync offline-first en Flutter + Firebase

Artículo 1 de 3 — Flutter en producción
Offline-first, Riverpod, monorepo Melos: mobile en serio, no un prototipo.

En móvil, la conectividad nunca está garantizada: metro, ascensor, avión. Una app offline-first no trata la desconexión como un error, sino como el estado normal — la red no es más que una optimización. Con Flutter y Firebase, es casi gratis.

Firestore es offline-first por defecto

El SDK de Firestore mantiene una caché local persistente y sirve las lecturas desde esa caché cuando no hay red. En móvil está activado por defecto; se puede configurar explícitamente:

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

Las escrituras se ponen en cola

Una escritura sin conexión no falla: se añade a una cola local, que se reproduce en cuanto vuelve la red. La UI puede mostrar el dato de inmediato (lectura optimista) gracias al indicador hasPendingWrites expuesto en los metadatos del 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});

Resolver los conflictos

Dos dispositivos modifican el mismo documento sin conexión: ¿quién gana? Por defecto, last-write-wins , lo que puede sobrescribir un dato. Para un contador, se prefiere FieldValue.increment() (conmutativo, por lo tanto sin conflicto); para el resto, un updatedAt con FieldValue.serverTimestamp() decide en el momento de la sincronización.

  • contadores → increment()
  • marca de tiempo del servidor → serverTimestamp()
  • regla de negocio compleja → una transacción en una Cloud Function

Probar la desconexión

No se prueba el offline «a ojo»: firestore.disableNetwork() fuerza el modo desconectado en una prueba de integración, y luego enableNetwork() reproduce la cola. La guía offline de Firestore documenta cada API.

El offline-first no consiste en gestionar un fallo de red. Consiste en concebir la app como si la red no existiera , y dejar que la sincronización sea solo un detalle de implementación.
super-dev — portfolio.app
// Continuar en FLUTTER
Una arquitectura Flutter testable con Riverpod
8 min • 2,0k lecturas
Monorepo Flutter con Melos
6 min • 1,2k lecturas