変更に対応する - React Flutter SDK
項目一覧
すべての Flutter SDK オブジェクトはライブ オブジェクトであるため、変更されるたびに自動的に更新されます。 SDK は、プロパティが変更されるたびに通知イベントを発行します。
ユーザーが新しい項目をリストに追加するときに、UI を更新したり、通知を表示したり、メッセージをログに記録したりすることができます。 そのアイテムがアップデートされたら、その可視化状態を変更したり、ネットワークリクエストを起動したりする必要があるかもしれません。 最後に、誰かがアイテムを削除した場合は、UI からそれを削除する必要がある可能性があります。 SDK の通知システムを使用すると、変更の原因となった書込み (write) とはReactに、データ内の変更を監視し、対応することができます。
次のイベントの変更をサブスクライブできます。
このページの例について
このページの例では、 Character
とFellowship
の 2 つのオブジェクトタイプを使用します。
()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; }
さらに、例には次のサンプル データがあります。
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 });
リスナーの登録
クエリ変更リスナーの登録
Realm内の任意のクエリに通知ハンドラーを登録できます。ハンドラーは RealmResultschanges を受け取ります オブジェクト。これには、最後の通知以降の変更の説明が含まれます。RealmResultsChanges
には次のプロパティが含まれています。
プロパティ | タイプ | 説明 |
inserted | List<int> | このバージョンで追加された新しいコレクション内のインデックス。 |
modified | List<int> | このバージョンで変更された新しいコレクション内のオブジェクトのインデックス。 |
deleted | List<int> | このバージョンから削除された、コレクションの以前のバージョン内のインデックス。 |
newModified | List<int> | 削除および挿入後に変更されたオブジェクトのインデックスは、考慮されます。 |
moved | List<int> | 移動されたコレクション内のオブジェクトのインデックス。 |
results | RealmResults< RealmObject としての T<T as RealmObject> | 変更が監視されている結果コレクション。 |
isCleared | ブール | 通知コールバックで結果コレクションが空の場合は true を返します。 |
// 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 });
RealmObject 変更リスナーの登録
Realm 内の特定のオブジェクトに通知ハンドラーを登録できます。 Realm は、オブジェクトのプロパティのいずれかが変更されたときにハンドラーに通知します。 ハンドラーは RealmObject Changes を受け取ります オブジェクト(最後の通知以降の変更の説明を含む)RealmObjectChanges
には次のプロパティが含まれています。
プロパティ | タイプ | 説明 |
isDeleted | ブール | true オブジェクトが削除された場合。 |
object | RealmObject | 変更が監視されている Realm オブジェクト。 |
properties | List<String> | 変更された Realm オブジェクトのプロパティの名前。 |
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. });
コレクション変更リスナーの登録
バージョン 1.7.0 での変更: RealmMap
変更リスナーのサポートを追加しました。
バージョン2.0.0での変更: コレクション リスナーにisCollectionDeleted
プロパティを追加しました。 RealmMapChanges
にisCleared
プロパティを追加しました。
別のRealmObject
内でサポートされているデータ型のコレクションに通知ハンドラーを登録できます。 Realm は、コレクション内のいずれかの項目が変更されると、ハンドラーに通知します。 ハンドラーは、最後の通知以降の変更の説明を含む次のいずれかのオブジェクトを受け取ります。
RealmListchanges のオブジェクト
RealmList
RealmSetchanges のオブジェクト
RealmSet
RealmMapchanges のオブジェクト
RealmMap
RealmListChanges
には、次のプロパティが含まれています。
プロパティ | タイプ | 説明 |
---|---|---|
inserted | List<int> | このバージョンで追加されたリスト内の項目のインデックス。 |
modified | List<int> | このバージョンで変更された、前のバージョンのリスト内の項目のインデックス。 |
deleted | List<int> | このバージョンから削除された、以前のバージョンのリスト内の項目のインデックス。 |
newModified | List<int> | 削除および挿入後の変更された項目のインデックスは、考慮されます。 |
moved | List<int> | このバージョンで移動されたリスト内の項目のインデックス。 |
list | RealmList<T> | RealmList 変更が監視されています。 |
isCleared | ブール値 | true RealmList.client() を呼び出してリストがクリアされた場合使用して複数のドキュメントを挿入できます。 |
isCollectionDeleted | ブール値 | true リストを含む親オブジェクトが削除された場合。 |
RealmSetChanges
には、次のプロパティが含まれています。
プロパティ | タイプ | 説明 |
---|---|---|
inserted | List<int> | このバージョンで追加されたセット内の項目のインデックス。 |
modified | List<int> | このバージョンで変更された、前のバージョンのセット内の項目のインデックス。 |
deleted | List<int> | このバージョンから削除された、以前のバージョンのセット内の項目のインデックス。 |
newModified | List<int> | 削除および挿入後の変更された項目のインデックスは、考慮されます。 |
moved | List<int> | このバージョンで移動されたセット内の項目のインデックス。 |
set | RealmSet<T> | RealmSet 変更が監視されています。 |
isCleared | ブール値 | true RealmSet.client() を呼び出してセットがクリアされた場合使用して複数のドキュメントを挿入できます。 |
isCollectionDeleted | ブール値 | true セットを含む親オブジェクトが削除された場合。 |
RealmMapChanges
には、次のプロパティが含まれています。
プロパティ | タイプ | 説明 |
---|---|---|
inserted | List<String> | このバージョンで追加されたマップのキー。 |
modified | List<String> | このバージョンで対応する値が変更された、前のバージョンのマップのキー。 |
deleted | List<String> | このバージョンから削除された、前のバージョンのマップのキー。 |
map | RealmMap<T> | RealmMap 変更が監視されています。 |
isCleared | ブール値 | true マップが RealmMap.client() を呼び出してクリアされた場合使用して複数のドキュメントを挿入できます。 |
isCollectionDeleted | ブール値 | true マップを含む親オブジェクトが削除された場合。 |
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`. });
ユーザー インスタンスの変更リスナーの登録
バージョン 1.9.0 の新機能。
Flutter SDK バージョン1.9.0以降では、Realm 内の特定のUser
インスタンスに通知ハンドラーを登録できます。 Realm は、ユーザーのプロパティのいずれかが変更されたときにハンドラーに通知します(たとえば、ユーザー アクセス トークンがアップデートされたり、ユーザーの状態が変化したり)。 ハンドラーは ユーザー変更を受信し ます オブジェクト(最後の通知以降の変更の説明を含む)UserChanges
には次のプロパティが含まれています。
プロパティ | タイプ | 説明 |
user | user | 変更された ユーザー インスタンス。 |
final userSubscription = user.changes.listen((changes) { changes.user; // the User being listened to });
変更リスナーの一時停止と再開
一時的に通知を受け取りたくない場合は、サブスクライブを一時停止します。 後でリスニングを再開できます。
subscription.pause(); // The changes.listen() method won't fire until subscription is resumed. subscription.resume();
変更リスナーのサブスクライブを解除します
監視対象のデータへのアップデートに関する通知を受信したくない場合は、変更リスナーからサブスクライブを解除します。
await subscription.cancel();
通知制限の変更
4 レベルよりも深いネストされたドキュメントの変更では、変更通知はtriggerされません。
5 レベル以上の変更をリッスンする必要があるデータ構造がある場合は、次の回避策があります。
スキーマをリファクタリングしてネストを減らします。
ユーザーがデータを手動で更新できるようにするには、「push-to-refresh」のようなものを追加します。