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 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:
Sobre os exemplos nesta página
Os exemplos nesta página usam dois tipos de objeto, Character
e 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; }
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 });
Registrar um ouvinte
Registrar um ouvinte de alteração de query
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. ORealmResultsChanges
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 });
Registrar um ouvinte de alteração do RealmObject
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. });
Registrar ouvintes de alteração de coleção
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 objeto para
RealmList
RealmSetChanges objeto para
RealmSet
RealmMapChanges objeto para
RealmMap
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`. });
Registre um ouvinte de alteração de instância de usuário
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 });
Pausar e retomar um ouvinte de alterações
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();
Cancelar a assinatura de um ouvinte de alterações
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();
Alterar limites de notificação
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.