Menu Docs

Reagir a alterações - SDK do Flutter

Todos os objetos do Flutter SDK são objetos ativos, o que significa que eles são atualizados automaticamente sempre que são modificados. O SDK emite um evento de notificação sempre que alguma propriedade é alterada.

Quando um usuário adiciona um novo item a uma lista, você pode querer atualizar a UI, mostrar uma notificação ou registrar uma mensagem. Quando alguém atualiza esse item, você pode querer alterar seu estado visual ou disparar uma solicitação de rede. Por fim, quando alguém exclui o item, você provavelmente quer removê-lo da UI. O sistema de notificação do SDK permite observar e React a alterações em seus dados, independentemente das gravações que causaram as alterações.

Você pode assinar as alterações nos seguintes eventos:

Os exemplos nesta página usam dois tipos de objeto, Character e 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;
}

Além disso, os exemplos têm estes dados de amostra:

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

Você pode registrar um manipulador de notificações em qualquer query dentro de um Realm. O manipulador recebe um RealmResultsChanges objeto, que inclui a descrição das alterações desde a última notificação. RealmResultsChanges contém as seguintes propriedades:

Propriedade

Tipo

Descrição

inserted

List<int>

Índices na nova collection adicionados nesta versão.

modified

List<int>

Índices dos objetos na nova coleção que foram modificados nesta versão.

deleted

List<int>

Índices na versão anterior da collection que foram removidos desta.

newModified

List<int>

Índices de objetos modificados depois de levar em conta exclusões e inserções.

moved

List<int>

Os índices dos objetos da collection que foram movidos.

results

RealmResults<t as="" realmobject=""></t>

A collection de resultados está sendo monitorada quanto a alterações.

isCleared

bool

Retorna true se a coleta de resultados estiver vazia na chamada de retorno de notificação.

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

Você pode registrar um manipulador de notificações em um objeto específico dentro de um Realm. O Realm notifica seu manipulador quando qualquer propriedade do objeto é alterada. O manipulador recebe um RealmObjectChanges objeto, que inclui a descrição das alterações desde a última notificação. RealmObjectChanges contém as seguintes propriedades:

Propriedade

Tipo

Descrição

isDeleted

bool

true se o objeto foi excluído.

object

RealmObject

Objeto de realm sendo monitorado quanto a alterações.

properties

List<String>

Nomes das propriedades do objeto Realm que foram alterados.

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

Alterado na versão 1.7.0: Adicionada compatibilidade com RealmMap ouvintes de alteração.

Alterado na versão 2.0.0: Adicionada propriedade isCollectionDeleted aos ouvintes de collections. propriedade isCleared adicionada a RealmMapChanges.

Você pode registrar um manipulador de notificação em uma coleção de qualquer um dos tipos de dados suportados dentro de outro RealmObject. O Realm notifica seu manipulador quando algum dos itens da coleção é alterado. O manipulador recebe um dos seguintes objetos que inclui uma descrição das alterações desde a última notificação:

RealmListChanges contém as seguintes propriedades:

Propriedade
Tipo
Descrição

inserted

List<int>

Índices de itens na lista que foram adicionados nesta versão.

modified

List<int>

Índices de itens na versão anterior da lista que foram modificados nesta versão.

deleted

List<int>

Índices de itens na versão anterior da lista que foram removidos desta versão.

newModified

List<int>

Índices de itens modificados após exclusões e inserções são contabilizados.

moved

List<int>

Índices dos itens na lista que foram movidos nesta versão.

list

Lista de domínios<T>

RealmList sendo monitorado quanto a alterações.

isCleared

booleano

true quando a lista foi limpa chamando o RealmList.clear() .

isCollectionDeleted

booleano

true quando o objeto principal que contém a lista tiver sido excluído.

RealmSetChanges contém as seguintes propriedades:

Propriedade
Tipo
Descrição

inserted

List<int>

Índices de itens no conjunto que foram adicionados nesta versão.

modified

List<int>

Índices dos itens na versão anterior do conjunto que foram modificados nesta versão.

deleted

List<int>

Índices de itens na versão anterior do conjunto que foram removidos desta versão.

newModified

List<int>

Índices de itens modificados após exclusões e inserções são contabilizados.

moved

List<int>

Índices dos itens no conjunto que foram movidos nesta versão.

set

RealmSet<T>

RealmSet sendo monitorado quanto a alterações.

isCleared

booleano

true quando o conjunto foi limpo ligando para o RealmSet.clear() método.

isCollectionDeleted

booleano

true quando o objeto principal que contém o conjunto tiver sido excluído.

RealmMapChanges contém as seguintes propriedades:

Propriedade
Tipo
Descrição

inserted

List<String>

Chaves do mapa que foram adicionadas nesta versão.

modified

List<String>

Chaves da versão anterior do mapa cujos valores correspondentes foram modificados nesta versão.

deleted

List<String>

Chaves da versão anterior do mapa que foram removidas desta versão.

map

RealmMap<T>

RealmMap sendo monitorado quanto a alterações.

isCleared

booleano

true quando o mapa foi limpo ligando para o método RealmMap.clear() método.

isCollectionDeleted

booleano

true quando o objeto principal que contém o mapa tiver sido excluído.

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

Novidades na versão 1.9.0.

No Flutter SDK versão 1.9.0 e posterior, você pode registrar um manipulador de notificações em uma instância User específica dentro de um Realm. O Realm notifica seu manipulador quando qualquer propriedade do usuário é alterada (por exemplo, o token de acesso do usuário é atualizado ou o estado do usuário é alterado). O manipulador recebe um UserChanges objeto, que inclui a descrição das alterações desde a última notificação. UserChanges contém a seguinte propriedade:

Propriedade

Tipo

Descrição

user

Usuário

A instância de usuário que foi alterada.

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

Pause sua assinatura se não quiser receber notificações temporariamente. Mais tarde, você pode retomar a escuta.

subscription.pause();
// The changes.listen() method won't fire until subscription is resumed.
subscription.resume();

Cancele a assinatura do seu ouvinte de alterações quando não quiser mais receber notificações sobre atualizações nos dados que ele está assistindo.

await subscription.cancel();

Alterações em documentos aninhados com mais de quatro níveis abaixo não acionam notificações de alterações.

Se você tiver uma estrutura de dados em que precise escutar as alterações em cinco níveis para baixo ou mais profundamente, as soluções alternativas incluem:

  • Refatore o esquema para reduzir o aninhamento.

  • Adicione algo como "pressione para atualizar" para permitir que os usuários atualizem os dados manualmente.