Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ /

Reagir a alterações - SDK do Flutter

Nesta página

  • Sobre os exemplos nesta página
  • Registrar um ouvinte
  • Registrar um ouvinte de alteração de query
  • Registrar um ouvinte de alteração do RealmObject
  • Registrar ouvintes de alteração de coleção
  • Registre um ouvinte de alteração de instância de usuário
  • Pausar e retomar um ouvinte de alterações
  • Cancelar a assinatura de um ouvinte de alterações
  • Alterar limites de notificação

Todos os objetos do SDK do Flutter 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 reagir a alterações em seus dados, independentemente das gravações que causaram as alterações.

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

  • Query sobre a collection

  • Objeto de Realm

  • Collections em um objeto de Realm

  • Instância de usuário

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 como RealmObject>
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 domínio. 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
RealmList<T>
RealmList sendo monitorado quanto a mudanças.
isCleared
booleano
true quando a lista foi limpa ligando para o RealmList.clear() método.
isCollectionDeleted
booleano
true quando o objeto principal contendo 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 mudanças.
isCleared
booleano
true quando o conjunto foi limpo chamando seu RealmSet.clear() método.
isCollectionDeleted
booleano
true quando o objeto principal contendo 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 mudanças.
isCleared
booleano
true quando o mapa foi limpo ligando para o método RealmMap.clear() método.
isCollectionDeleted
booleano
true quando o objeto principal contendo 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 específica User 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.

Voltar

Excluir

Próximo

Congelar dados