변경 사항에 대응 - Flutter SDK
이 페이지의 내용
모든 Flutter SDK 객체는 라이브 객체 이므로 수정될 때마다 자동으로 업데이트 됩니다. SDK는 속성 이 변경될 때마다 알림 이벤트 를 발생시킵니다.
사용자가 목록에 새 항목을 추가할 때 UI 를 업데이트 하거나, 알림을 표시하거나, 메시지를 로그 할 수 있습니다. 누군가 해당 항목을 업데이트하면 시각적 상태 를 변경하거나 네트워크 요청 을 실행할 수 있습니다. 마지막으로 누군가 항목을 삭제하면 UI 에서 해당 항목을 제거 해야 할 수 있습니다. SDK의 알림 시스템을 사용하면 변경을 일으킨 쓰기와 관계없이 데이터의 변경 사항을 관찰하고 이에 React 수 있습니다.
다음 이벤트에 대한 변경 사항을 구독할 수 있습니다.
해당 페이지의 예제에 대한 정보
이 페이지의 예제에서는 Character
및 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; }
또한 예제에는 다음과 같은 샘플 데이터가 있습니다.
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<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 은 객체의 속성이 변경되면 핸들러에게 알립니다. 핸들러는 RealmObjectChanges 마지막 알림 이후의 변경 사항에 대한 설명이 포함된 객체 입니다. 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.clear() 를 호출하여 목록이 지워진 경우 메서드. |
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.clear() 를 호출하여 설정하다 가 지워진 경우 메서드. |
isCollectionDeleted | 부울 | true 설정하다 를 포함하는 상위 객체 가 삭제된 경우. |
RealmMapChanges
다음과 같은 속성이 포함됩니다.
속성 | 유형 | 설명 |
---|---|---|
inserted | List<String> | 이 버전에 추가된 지도의 키입니다. |
modified | List<String> | 이 버전에서 해당 값이 수정된 이전 버전 맵의 키입니다. |
deleted | List<String> | 이 버전에서 제거된 이전 버전 맵의 키입니다. |
map | RealmMap<T> | RealmMap 변경 사항이 모니터링되고 있습니다. |
isCleared | 부울 | true RealmMap.clear() 를 호출하여 지도가 지워진 경우 메서드. |
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 이상에서는 영역 내의 특정 User
인스턴스 에 알림 핸들러를 등록할 수 있습니다. Realm 은 사용자의 속성이 변경되면( 예시: 사용자 액세스 토큰이 업데이트되거나 사용자 상태 가 변경될 때) 핸들러에 알립니다. 핸들러 는 다음을 수신합니다. 마지막 알림 이후의 변경 사항에 대한 설명이 포함된 객체 입니다. UserChanges
에는 다음과 같은 속성 이 포함되어 있습니다.
속성 | 유형 | 설명 |
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단계 아래로 내려가면 변경 알림이 트리거되지 않습니다.
5단계 아래 또는 그 이상의 변경 사항을 수신해야 하는 데이터 구조가 있는 경우 해결 방법은 다음과 같습니다.
스키마를 리팩터링하여 중첩을 줄입니다.
사용자가 수동으로 데이터를 새로 고칠 수 있도록 '푸시하여 새로 고침'과 같은 내용을 추가합니다.