Coaspe

Flutter - RestorationMixin<S extends StatefulWidget> 본문

Flutter/API

Flutter - RestorationMixin<S extends StatefulWidget>

Coaspe 2023. 2. 17. 13:58

StatefulWidgetState 객체를 위한 restoration 데이터를 관리합니다.

 

Restoration 데이터는 직렬화되어 나중에 State 객체의 stateful 멤버를 데이터가 생성되었을 때와 동일한 값으로 복원하는 데 사용될 수 있습니다. (예를 들면, 앱을 최소화하여 다른 작업을 하고 왔을 때, 이전의 상태값을 복원하는 것 더 나은 UX를 제공)

 

이 mixin은  RestorablePropertyState 객체의 restoration 데이터를 구조화합니다. State 객체가 복원하는 동안 복원하고자 하는 모든 정보들은 RestorableProperty의 서브클래스에 저장되어야 합니다. 예를 들면, 카운터 앱의 카운트 값을 저장하고 싶다면, 단순한 int 타입으로 값을 저장하는 게 아니라, RestorableInt 타입의 멤버 변수에 값을 저장해야 합니다.

 

이 mixin은 RestorablePropertys의 현재 값이 restoration state의 일부로 직렬화되도록 보장합니다. 해당 프로퍼티에 저장된 데이터가 최신의 상태를 유지하는 것은 State에 달려있습니다. 위젯이 이전에 생성된 restoration 데이터에서 복원되면, RestorablePropertys의 값이 restoration 데이터가 직렬화될 때의 값으로 자동으로 복원됩니다.

 

이 mixin을 사용하는 State에서, 멤버 변수를 초기화하기 위해 RestorablePropertys가 보통 인스턴스화됩니다. mixin의 유저들은 반드시 restoreState을 오버라이드해야하고, 해당 메소드 안에서 registerForRestoration을 호출함으로써 이전에 인스턴스화된 RestorablePropertys을 등록해야합니다. 이 mixin은 State.initState 직후에 registerForRestoration를 처음 호출합니다. 등록 이후에, 프로퍼티에 저장된 값이 이전의 값으로 복원되거나- 만약 복원을 위한 restoration 데이터가 없다면 - 그 값들은 property-specific 디폴트 값(프로퍼티마다 가지고 있는 디폴트값)으로 초기화됩니다. State 객체의 생명주기의 끝에서, 모든 복원가능한 프로퍼티들은 State.dispose에서 처리되어야 합니다.

 

State.initState 실행 직후에 호출되기 위해서, restoreState은 mixin에 새로운 restoration 데이터가 제공되면 다시 호출됩니다. 이런 일이 발생하면, StateregisterForRestoration로 새로운 restoration 데이터에 따라 프토퍼티들을 그들의 이전 값으로 다시 복원하기 위해 모든 프로퍼티들을 재등록 해야합니다. 복원가능한 프로퍼티의 현재 값에 의존하는 초기화 로직은 그 프로퍼티들이 State 객체의 라이프타임 동안에 다른 값으로 저장 될 때 registerForRestoration을 재실행하는 것을 보장하기 위해서 restoreState 안에 포함되어 있어야합니다.

이런 식으로

내부적으로, 이 mixin은 State-provided restorationId을 사용하여 RestorationScope 주변에서 선언된 RestorationBucket에 등록된 프로퍼티들에 restoration 데이터를 저장합니다.

State-provided restorationId

restorationIdRestorationScope 주변에서 고유해야합니다. State 복원은 이 mixin을 사용하는 State의 restorationId이 null이거나, surrounding RestorationScope이 없다면 사용이 불가능합니다. 이런 경우에, 등록된 프로퍼티들의 값들은 state 복원하는 동안 복원되지 않습니다.

 

등록된 프로퍼티들을 저장하는 RestorationBucketbucket getter로 사용이 가능합니다. bucket과 직접적으로 상호작용하는 것은 드무나, State 객체는 자식 객체가 자식 bucket을 claim(선언 정도로 이해하면 될듯 싶다) 할 때 이 bucket을 사용할 수 있도록 만들 수 있습니다. 그렇게 하기 위해서, bucketUnmanagedRestorationScope의 도움을 받아 State.build의 위젯트리에 주입됩니다.

 

State 복원이 턴오프되어있으면, bucket getter은 null을 반환합니다. 만약, state 복원이 턴온에서 턴오프가 되면, getter로 반환되는 값은 non-null에서 null 값이 됩니다.(e.g. restorationId 값이 non-null에서 null로 바뀌므로) 반대의 경우도 같습니다. 이 mixin은 State 객체에게 이런 변화를 알리기 위해, didToggleBucket을 호출합니다.

didToggleBucket

State 객체가 직접적으로 bucket과 상호작용하는 것이 아니라면, 굳이 이 함수를 오버라이드 할 필요는 없습니다.

 

restorationId의 반환값이 바뀔 때마다, didUpdateRestorationId이 반드시 호출되어야 합니다.(변화에 의해 didUpdateWidget가 먼저 호출되지 않은 경우. didUpdateWidget은 내부 구현에서 didUpdateRestorationId을 호출합니다.)

didUpdateRestorationId
didUpdateWidget

 

이 코드는 RestorationMixin and a RestorableInt를 사용하여 어떻게 카운터 앱을 restorable하게 만드는지 간단하게 보여줍니다.

 

 

See also:

  • RestorableProperty, which is the base class for all restoration properties managed by this mixin.
  • RestorationManager, which describes how state restoration in Flutter works.
  • RestorationScope, which creates a new namespace for restoration IDs in the widget tree.

'Flutter > API' 카테고리의 다른 글

Flutter - ImplicitlyAnimatedWidget  (0) 2023.02.17
Flutter - Tween<T extends Object?>  (0) 2023.02.17
Flutter - InheritedWidget  (0) 2023.02.17
Flutter - StatefulWidget  (0) 2023.02.17
Flutter - Object  (0) 2023.02.17
Comments