Docs Menu

변경 사항에 대응 - Flutter SDK

모든 Flutter SDK 객체는 라이브 객체 이므로 수정될 때마다 자동으로 업데이트 됩니다. SDK는 속성 이 변경될 때마다 알림 이벤트 를 발생시킵니다.

사용자가 목록에 새 항목을 추가할 때 UI 를 업데이트 하거나, 알림을 표시하거나, 메시지를 로그 할 수 있습니다. 누군가 해당 항목을 업데이트하면 시각적 상태 를 변경하거나 네트워크 요청 을 실행할 수 있습니다. 마지막으로 누군가 항목을 삭제하면 UI 에서 해당 항목을 제거 해야 할 수 있습니다. SDK의 알림 시스템을 사용하면 변경을 일으킨 쓰기와 관계없이 데이터의 변경 사항을 관찰하고 이에 React 수 있습니다.

다음 이벤트에 대한 변경 사항을 구독할 수 있습니다.

이 페이지의 예제에서는 CharacterFellowship 라는 두 가지 객체 유형을 사용합니다.

@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

목록<int>

이 버전에 추가된 새 컬렉션의 인덱스입니다.

modified

목록<int>

이 버전에서 수정된 새 컬렉션에 있는 객체의 인덱스입니다.

deleted

목록<int>

이전 버전의 컬렉션에 있었지만 이 컬렉션에서 제거된 인덱스입니다.

newModified

목록<int>

삭제 및 삽입 후 수정된 객체의 인덱스가 고려됩니다.

moved

목록<int>

이동한 컬렉션 내 객체의 인덱스입니다.

results

RealmResults<t as="" realmobject=""></t>

결과 컬렉션에 변경 사항이 있는지 모니터링 중입니다.

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 은 객체의 속성이 변경되면 핸들러에게 알립니다. 핸들러는 RealmObjectChanges 마지막 알림 이후의 변경 사항에 대한 설명이 포함된 객체 입니다. RealmObjectChanges 에는 다음과 같은 속성이 포함되어 있습니다.

속성

유형

설명

isDeleted

부울

객체 가 삭제된 경우 true 입니다.

object

RealmObject

변경 사항을 모니터링하는 Realm 객체입니다.

properties

목록<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

목록<int>

이 버전에 추가된 목록 내 항목의 인덱스입니다.

modified

목록<int>

이 버전에서 수정된 목록의 이전 버전에 있는 항목의 인덱스입니다.

deleted

목록<int>

이 버전에서 제거된 목록의 이전 버전에 있는 항목의 인덱스입니다.

newModified

목록<int>

삭제 및 삽입 후 수정된 항목의 인덱스 고려됩니다.

moved

목록<int>

이 버전에서 이동한 목록 내 항목의 인덱스입니다.

list

RealmList<T>

RealmList 에 변경 사항이 있는지 모니터링 중입니다.

isCleared

부울

isCollectionDeleted

부울

목록이 포함된 상위 객체 가 삭제된 경우 true 입니다.

RealmSetChanges 에는 다음과 같은 속성이 포함되어 있습니다.

속성
유형
설명

inserted

목록<int>

이 버전에 추가된 설정하다 내 항목의 인덱스입니다.

modified

목록<int>

이 버전에서 수정된 이전 버전 세트에 있는 항목의 인덱스입니다.

deleted

목록<int>

이 버전에서 제거된 이전 버전 설정하다 의 항목 인덱스입니다.

newModified

목록<int>

삭제 및 삽입 후 수정된 항목의 인덱스 고려됩니다.

moved

목록<int>

이 버전에서 이동한 설정하다 내 항목의 인덱스입니다.

set

RealmSet<T>

RealmSet 에 변경 사항이 있는지 모니터링 중입니다.

isCleared

부울

true RealmSet.clear() 를 호출하여 설정하다 가 지워진 경우 메서드.

isCollectionDeleted

부울

설정하다 를 포함하는 상위 객체 가 삭제된 경우 true 입니다.

RealmMapChanges 에는 다음과 같은 속성이 포함되어 있습니다.

속성
유형
설명

inserted

목록<String>

이 버전에 추가된 지도의 키입니다.

modified

목록<String>

이 버전에서 해당 값이 수정된 이전 버전 맵의 키입니다.

deleted

목록<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단계 아래 또는 그 이상의 변경 사항을 수신해야 하는 데이터 구조가 있는 경우 해결 방법은 다음과 같습니다.

  • 스키마를 리팩터링하여 중첩을 줄입니다.

  • 사용자가 수동으로 데이터를 새로 고칠 수 있도록 '푸시하여 새로 고침'과 같은 내용을 추가합니다.