Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

変更に対応する - React Flutter SDK

項目一覧

  • このページの例について
  • リスナーの登録
  • クエリ変更リスナーの登録
  • RealmObject 変更リスナーの登録
  • コレクション変更リスナーの登録
  • ユーザー インスタンスの変更リスナーの登録
  • 変更リスナーの一時停止と再開
  • 変更リスナーのサブスクライブを解除します
  • 通知制限の変更

すべての Flutter SDK オブジェクトはライブ オブジェクトであるため、変更されるたびに自動的に更新されます。 SDK は、プロパティが変更されるたびに通知イベントを発行します。

ユーザーが新しい項目をリストに追加するときに、UI を更新したり、通知を表示したり、メッセージをログに記録したりすることができます。 そのアイテムがアップデートされたら、その可視化状態を変更したり、ネットワークリクエストを起動したりする必要があるかもしれません。 最後に、誰かがアイテムを削除した場合は、UI からそれを削除する必要がある可能性があります。 SDK の通知システムを使用すると、変更の原因となった書込み (write) とはReactに、データ内の変更を監視し、対応することができます。

次のイベントの変更をサブスクライブできます。

  • コレクションに対するクエリ

  • Realm オブジェクト

  • Realm オブジェクト内のコレクション

  • ユーザー インスタンス

このページの例では、 CharacterFellowshipの 2 つのオブジェクトタイプを使用します。

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

さらに、例には次のサンプル データがあります。

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

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プロパティを追加しました。 RealmMapChangesisClearedプロパティを追加しました。

別のRealmObject内でサポートされているデータ型のコレクションに通知ハンドラーを登録できます。 Realm は、コレクション内のいずれかの項目が変更されると、ハンドラーに通知します。 ハンドラーは、最後の通知以降の変更の説明を含む次のいずれかのオブジェクトを受け取ります。

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」のようなものを追加します。

戻る

削除