[Flutter] Riverpod과 Hooks의 상태관리 구분하기

고랭지참치·2024년 6월 10일
0

Flutter

목록 보기
6/24

Flutter에서는 앱 State를 2가지 종류로 구분하여 설명한다.

Ephemeral state and App state
Ephemeral state (sometimes called UI state or local state) is the state you can neatly contain in a single widget.

리버팟 공식문서에 따르면 Riverpod provider는 Global State(App State)를 위해서, 그 외 Local State(Ephemeral State)에서는 Hooks를 사용하는 것을 권장하고 있다.

If Riverpod's providers are for "global" application state, hooks are for local widget state. Hooks are typically used for dealing with stateful UI objects,
https://riverpod.dev/docs/concepts/about_hooks

회사 프로젝트에서는 API통신을 통해 생성한 데이터 모델/엔티티의 상태를 관리하는 것은 Riverpod Provider를 통하며, 한 Screen에서만 사용되는 버튼 활성화 유무, 사용자가 텍스트필드 입력을 마쳤는지에 대한 상태확인은 Hooks의 useState를 통해서 관리하고 있다.

하지만 이 규칙을 적용하기 어려운 상황들도 존재한다.

그 중 하나는 이미 API에서 함수 규격을 정해놓은 상태라 ValueNotifier 변수 혹은 값을 변경하는 함수 파라미터를 전달할 수 없는 경우였다.



예를 들어 Flutter Unity Widget 라이브러리는 다음과 같은 위젯 인터페이스를 제공한다.

UnityWidget(
    onUnityCreated: onUnityCreated,
    onUnityMessage: onUnityMessage,
    onUnitySceneLoaded: onUnitySceneLoaded,
    onUnityUnloaded: onUnityUnloaded,
    ...
)
typedef void UnityMessageCallback(dynamic handler);

typedef void UnitySceneChangeCallback(SceneLoaded? message);

typedef void UnityUnloadCallback();

이미 typeDef로 함수규격을 정해놨기 떄문에, 이벤트 함수에 hooks로 생성한 state변경 함수를 보내기 어려운 상태인 것이다.

이런 경우 위젯을 감싸는 스크린은 statefulWidget으로 만들어 전역으로 ref를 사용할 수 있도록 만들고, 함수 안에서 ref로 provider를 호출하여 state를 변경하는 식으로 문제를 해결했다.




모든 state를 riverpod provider로 통일하는 식으로 문제를 해결할 수 있겠지만, 그럴 때 단순한 값을 state로 갖는 Provider가 생겨져 너무 많은 provider들을 관리해야하는 로드가 생겼다. 위에 예시보다도 더 좋은 해결방법이 있을 것이라고 생각하기 때문에, 더 고민해서 리펙토링을 해보고 싶다.

profile
소프트웨어 엔지니어 / Flutter 개발자

0개의 댓글