No busques más en otros sitios porque has llegado al lugar adecuado, poseemos la respuesta que quieres encontrar sin complicaciones.
Solución:
cuando usa la persistencia sin conexión en Firestore, no use transacciones ni await
por respuesta
Entonces, cambia esto:
await Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);
a esto:
Firestore.instance.collection('certificados').document((certID.toString()))
.setData(finalDataMap);
Cuando restaure su conexión a Internet, sus datos se sincronizarán automáticamente, incluso si está en segundo plano.
No funciona cuando tu aplicación está cerrada.
Contexto de promesas y devoluciones de llamada cuando está fuera de línea
¿Por qué el cambio de código anterior para eliminar “await” funciona?
Referencia: Video de Firebase: ¿Cómo habilito la compatibilidad sin conexión? 11:13
Su devolución de llamada no será llamada y su promesa no se completará hasta que la escritura del documento haya sido exitosa en el servidor. Esta es la razón por la que si su interfaz de usuario espera hasta que se complete la escritura para hacer algo, parece congelarse en “modo fuera de línea”, incluso si la escritura realmente se realizó en el caché local.
Está bien no usar async / await
, .then()
o callbacks
. Firestore siempre “actuará” como si el cambio de datos se aplicara de inmediato, por lo que no necesita esperar para trabajar con datos nuevos.
Solo necesita usar devoluciones de llamada y promesas cuando necesita asegurarse de que se ha producido una escritura del servidor y desea bloquear otras cosas para que no sucedan hasta que obtenga esa confirmación.
Creo que la respuesta actual está desactualizada. De acuerdo con la documentación de firebase, la persistencia sin conexión está habilitada de forma predeterminada para Android e iOS. Para la web, no lo es.
En flutter, la implementación de firestore se basa en el sistema operativo subyacente. Por lo tanto, está seguro en las aplicaciones móviles, pero no con flutter para web.
Está habilitado de forma predeterminada, pero solo cuando no está utilizando espera o transacciones; además, puede usar el tiempo de espera para dejar de escuchar la conexión de red por Firestore después de un tiempo específico.
ref.setData(newNote.toMap()).timeout(Duration(seconds: 2),onTimeout:()
//cancel this call here
print("do something now");
);