Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

변경 사항에 대응 - Flutter SDK

이 페이지의 내용

  • 해당 페이지의 예제에 대한 정보
  • 리스너 등록
  • 쿼리 변경 리스너 등록
  • RealmObject 변경 리스너 등록
  • 컬렉션 변경 리스너 등록
  • 사용자 인스턴스 변경 리스너 등록
  • 변경 리스너 일시 중지 및 재개
  • 변경 리스너 구독 취소
  • 알림 한도 변경

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

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

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

  • 컬렉션에 대한 쿼리

  • Realm 객체

  • Realm 객체의 컬렉션

  • 사용자 인스턴스

이 페이지의 예제에서는 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
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
});

영역 내의 특정 객체 에 대한 알림 핸들러를 등록할 수 있습니다. 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 속성 을 추가했습니다. 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.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단계 아래 또는 그 이상의 변경 사항을 수신해야 하는 데이터 구조가 있는 경우 해결 방법은 다음과 같습니다.

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

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

돌아가기

삭제