Docs Menu
Docs Home
/ /
Base de datos de reinos

Reaccionar a los cambios - SDK de Flutter

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:

  • Consulta sobre la colección

  • Objeto de reino

  • Colecciones en un objeto Realm

  • Instancia de usuario

Los ejemplos de esta página utilizan dos tipos de objetos, Character y Fellowship:

@RealmModel()
class _Character {
@PrimaryKey()
late ObjectId id;
late String name;
late String species;
late int age;
}
@RealmModel()
class _Fellowship {
@PrimaryKey()
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
});

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

inserted

Lista<int>

Índices de la nueva colección que se agregaron en esta versión.

modified

Lista<int>

Índices de los objetos de la nueva colección que fueron modificados en esta versión.

deleted

Lista<int>

Índices de la versión anterior de la colección que se han eliminado de esta.

newModified

Lista<int>

Se tienen en cuenta los índices de los objetos modificados después de eliminaciones e inserciones.

moved

Lista<int>

Índices de los objetos de la colección que se movieron.

results

Resultados del reino<T as RealmObject>

Se monitorea la recopilación de resultados para detectar cambios.

isCleared

bool

Devuelve true si la colección de resultados está vacía en la devolución de llamada de notificación.

// 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
});

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

isDeleted

bool

true Si el objeto fue eliminado.

object

Objeto de reino

Objeto de reino que se monitorea para detectar cambios.

properties

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.
});

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:

RealmListChanges contiene las siguientes propiedades:

Propiedad
Tipo
Descripción

inserted

Lista<int>

Índices de elementos de la lista que se agregaron en esta versión.

modified

Lista<int>

Índices de elementos de la versión anterior de la lista que fueron modificados en esta versión.

deleted

Lista<int>

Índices de elementos de la versión anterior de la lista que se eliminaron de esta versión.

newModified

Lista<int>

Se contabilizan los índices de elementos modificados después de eliminaciones e inserciones.

moved

Lista<int>

Índices de los elementos de la lista que se movieron en esta versión.

list

Lista de reinos<T>

RealmList siendo monitoreado para detectar cambios.

isCleared

booleano

true cuando la lista se ha borrado llamando a su método RealmList.clear().

isCollectionDeleted

booleano

true cuando se ha eliminado el objeto padre que contiene la lista.

RealmSetChanges contiene las siguientes propiedades:

Propiedad
Tipo
Descripción

inserted

Lista<int>

Índices de los elementos del conjunto que se agregaron en esta versión.

modified

Lista<int>

Índices de los elementos de la versión anterior del conjunto que fueron modificados en esta versión.

deleted

Lista<int>

Índices de elementos de la versión anterior del conjunto que se eliminaron de esta versión.

newModified

Lista<int>

Se contabilizan los índices de elementos modificados después de eliminaciones e inserciones.

moved

Lista<int>

Índices de los elementos del conjunto que se movieron en esta versión.

set

RealmSet<T>

RealmSet siendo monitoreado para detectar cambios.

isCleared

booleano

true cuando el conjunto se ha borrado llamando a su método RealmSet.clear().

isCollectionDeleted

booleano

true cuando se ha eliminado el objeto padre que contiene el conjunto.

RealmMapChanges contiene las siguientes propiedades:

Propiedad
Tipo
Descripción

inserted

Lista<String>

Claves del mapa que se agregaron en esta versión.

modified

Lista<String>

Claves de la versión anterior del mapa cuyos valores correspondientes fueron modificados en esta versión.

deleted

Lista<String>

Claves de la versión anterior del mapa que fueron eliminadas de esta versión.

map

Mapa del reino<T>

RealmMap siendo monitoreado para detectar cambios.

isCleared

booleano

true cuando el mapa se ha limpiado llamando a su método RealmMap.clear().

isCollectionDeleted

booleano

true cuando se ha eliminado el objeto padre que contiene el mapa.

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`.
});

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

user

Usuario

La instancia de usuario que ha cambiado.

final userSubscription = user.changes.listen((changes) {
changes.user; // the User being listened to
});

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();

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();

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.

Volver

Borrar

En esta página