Todos los objetos del SDK de Flutter son activos, lo que significa que se actualizan automáticamente al modificarse. El SDK emite una notificación cada vez que cambia alguna propiedad.
Cuando un usuario añade un nuevo elemento a una lista, es posible que quieras actualizar la Interfaz de Usuario, mostrar una notificación o registrar un mensaje. Cuando alguien actualiza ese elemento, es posible que quieras cambiar su estado visual o enviar una solicitud de red. Finalmente, cuando alguien borra el elemento, probablemente quieras removerlo de la Interfaz de Usuario. El sistema de notificaciones del SDK te permite observar y reaccionar a los cambios en tus datos, independientemente de las operaciones de guardado que causaron los cambios.
Puedes suscribirte a los cambios en los siguientes eventos:
Acerca de los ejemplos de esta página
Los ejemplos de esta página utilizan dos tipos de objetos, Character y Fellowship:
() class _Character { () late ObjectId id; late String name; late String species; late int age; } () class _Fellowship { () late ObjectId id; late String name; late List<_Character> members; }
Además, los ejemplos tienen estos datos de muestra:
final frodo = Character(ObjectId(), 'Frodo', 'Hobbit', 51); final samwise = Character(ObjectId(), 'Samwise', 'Hobbit', 39); final gollum = Character(ObjectId(), 'Gollum', 'Hobbit', 589); final aragorn = Character(ObjectId(), 'Aragorn', 'Human', 87); final legolas = Character(ObjectId(), 'Legolas', 'Elf', 2931); final gimli = Character(ObjectId(), 'Gimli', 'Dwarf', 140); final fellowshipOfTheRing = Fellowship( ObjectId(), 'Fellowship of the Ring', members: [frodo, samwise, aragorn, legolas, gimli]); final config = Configuration.local([Fellowship.schema, Character.schema]); final realm = Realm(config); realm.write(() { realm.add(fellowshipOfTheRing); realm.add(gollum); // not in fellowship });
Registrar un oyente
Registrar un oyente de cambio de consulta
Puedes registrar un controlador de notificaciones para cualquier consulta dentro de un dominio. El controlador recibe un mensaje "RealmResultsChanges".objeto, que incluye la descripción de los cambios desde la última notificación. RealmResultsChanges contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
| Lista<int> | Índices de la nueva colección que se agregaron en esta versión. |
| Lista<int> | Índices de los objetos de la nueva colección que fueron modificados en esta versión. |
| Lista<int> | Índices de la versión anterior de la colección que se han eliminado de esta. |
| Lista<int> | Se tienen en cuenta los índices de los objetos modificados después de eliminaciones e inserciones. |
| Lista<int> | Índices de los objetos de la colección que se movieron. |
| Resultados del reino<T as RealmObject> | Se monitorea la recopilación de resultados para detectar cambios. |
| bool | Devuelve |
// Listen for changes on whole collection final characters = realm.all<Character>(); final subscription = characters.changes.listen((changes) { changes.inserted; // Indexes of inserted objects. changes.modified; // Indexes of modified objects. changes.deleted; // Indexes of deleted objects. changes.newModified; // Indexes of modified objects after accounting for deletions & insertions. changes.moved; // Indexes of moved objects. changes.results; // The full List of objects. changes.isCleared; // `true` after call to characters.clear(); otherwise, `false`. }); // Listen for changes on RealmResults. final hobbits = fellowshipOfTheRing.members.query('species == "Hobbit"'); final hobbitsSubscription = hobbits.changes.listen((changes) { // ... all the same data as above });
Registrar un detector de cambios de RealmObject
Puedes registrar un controlador de notificaciones en un objeto específico dentro de un dominio. Realm notifica a tu controlador cuando cambia alguna de las propiedades del objeto. El controlador recibe un objeto RealmObjectChanges, que incluye una descripción de los cambios desde la última notificación. RealmObjectChanges contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
| bool |
|
| Objeto de reino | Objeto de reino que se monitorea para detectar cambios. |
| Lista<String> | Nombres de las propiedades del objeto Realm que han cambiado. |
final frodoSubscription = frodo.changes.listen((changes) { changes.isDeleted; // If the object has been deleted. changes.object; // The RealmObject being listened to, `frodo`. changes.properties; // The changed properties. });
Registrar oyentes de cambios de colección
Cambiado en la 1.7.0 versión: Se agregó soporte para RealmMap escuchas de cambios.
Modificado en la 2.0.0 versión: Se añadió isCollectionDeleted la propiedad a los escuchas de colección. Se añadió isCleared la propiedad RealmMapChanges a.
Puede registrar un controlador de notificaciones en una colección de cualquiera de los tipos de datos admitidos dentro de otro RealmObject. Realm notifica a su controlador cuando cambia alguno de los elementos de la colección. El controlador recibe uno de los siguientes objetos que incluyen una descripción de los cambios desde la última notificación:
Objeto RealmListChanges para
RealmListObjeto RealmSetChanges para
RealmSetObjeto RealmMapChanges para
RealmMap
RealmListChanges contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
|---|---|---|
| Lista<int> | Índices de elementos de la lista que se agregaron en esta versión. |
| Lista<int> | Índices de elementos de la versión anterior de la lista que fueron modificados en esta versión. |
| Lista<int> | Índices de elementos de la versión anterior de la lista que se eliminaron de esta versión. |
| Lista<int> | Se contabilizan los índices de elementos modificados después de eliminaciones e inserciones. |
| Lista<int> | Índices de los elementos de la lista que se movieron en esta versión. |
| Lista de reinos<T> |
|
| booleano |
|
| booleano |
|
RealmSetChanges contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
|---|---|---|
| Lista<int> | Índices de los elementos del conjunto que se agregaron en esta versión. |
| Lista<int> | Índices de los elementos de la versión anterior del conjunto que fueron modificados en esta versión. |
| Lista<int> | Índices de elementos de la versión anterior del conjunto que se eliminaron de esta versión. |
| Lista<int> | Se contabilizan los índices de elementos modificados después de eliminaciones e inserciones. |
| Lista<int> | Índices de los elementos del conjunto que se movieron en esta versión. |
| RealmSet<T> |
|
| booleano |
|
| booleano |
|
RealmMapChanges contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
|---|---|---|
| Lista<String> | Claves del mapa que se agregaron en esta versión. |
| Lista<String> | Claves de la versión anterior del mapa cuyos valores correspondientes fueron modificados en esta versión. |
| Lista<String> | Claves de la versión anterior del mapa que fueron eliminadas de esta versión. |
| Mapa del reino<T> |
|
| booleano |
|
| booleano |
|
final fellowshipSubscription = fellowshipOfTheRing.members.changes.listen((changes) { changes.inserted; // Indexes of inserted objects. changes.modified; // Indexes of modified objects. changes.deleted; // Indexes of deleted objects. changes.newModified; // Indexes of modified objects after accounting for deletions & insertions. changes.moved; // Indexes of moved objects. changes.list; // The full RealmList of objects. changes.isCleared; // `true` after call to fellowshipOfTheRing.members.clear(); otherwise, `false`. changes.isCollectionDeleted; // `true` if the collection is deleted; otherwise, `false`. });
Registrar un detector de cambios de instancia de usuario
Nuevo en la versión 1.9.0.
En la versión 1.9.0 y posteriores de Flutter SDK, puedes registrar un manejador de notificaciones en una instancia específica de User dentro de un realm. Realm notifica a tu manejador cuando cambia alguna de las propiedades del usuario (por ejemplo, si se actualiza el token de acceso del usuario o si cambia el estado del usuario). El manejador recibe un objeto de tipo UserChanges, que incluye la descripción de los cambios desde la última notificación. UserChanges contiene la siguiente propiedad:
Propiedad | Tipo | Descripción |
| Usuario | La instancia de usuario que ha cambiado. |
final userSubscription = user.changes.listen((changes) { changes.user; // the User being listened to });
Pausar y reanudar un detector de cambios
Pausa tu suscripción si no quieres recibir notificaciones temporalmente. Puedes reanudarlas más tarde.
subscription.pause(); // The changes.listen() method won't fire until subscription is resumed. subscription.resume();
Cancelar la suscripción de un oyente de cambios
Cancele la suscripción a su escucha de cambios cuando ya no desee recibir notificaciones sobre actualizaciones de los datos que está monitoreando.
await subscription.cancel();
Límites de notificación de cambios
Los cambios en documentos anidados a más de cuatro niveles de profundidad no activan notificaciones de cambio.
Si tiene una estructura de datos en la que necesita escuchar cambios cinco niveles más abajo o más profundos, las soluciones alternativas incluyen:
Refactorice el esquema para reducir la anidación.
Agregue algo como "push-to-refresh" para permitir que los usuarios actualicen los datos manualmente.