해당글은 Riverpod 공식문서를 참조하였습니다.
이전 글에서 우리는 Riverpod를 설치하고 간단하게 사용해 보았습니다.
프로바이더는 Riverpod에서 가장 중요한 부분 입니다.
이제 "Provider"에 대해 알아보도록 하겠습니다.
프로바이더는 하나의 상태조각의 압축된 객체이자 상태의 변화를 감시하는 역할을 합니다.
왜 프로바이더를 사용하나요?
상태를 프로바이더로 감싸게 되면 아래의 서술된 내용들이 가능합니다.
- 코드상 다양한 위치에서 상태를 쉽게 접근할 수 있습니다. 프로바이더는 Singletons, Service Locators, Dependency Injection 또는 InheritedWidgets 과 같은 디자인 패턴들을 완벽하게 대체할 수 있습니다.
- 다른 프로바이더 상태와 간편하게 결합하여 사용할 수 있습니다. 혹시 여러 객체들을 하나로 병합하는데 어려움을 격은적이 있나요? 프로바이더를 사용하면 프로바이더의 간단한 문법을 사용하여 구현할 수 있습니다.
- 퍼포먼스 최적화가 가능합니다. 위젯을 다시 빌드하는것을 필터링 하거나 비용이 높은 상태 계산을 캐싱하거나 프로바이더는 상태 변경의 영향을 받는 항목만 다시 계산합니다.
- 애플리케이션의 태스트 용이성이 높아집니다. 프로바이더와 함께라면, 복잡한 setUp/tearDown 단계가 불필요 합니다. 게다가 어떠한 프로바이더이든지 테스트 중의 프로바이더 행위를 오버라이드 할 수 있습니다. 매우 특정한 행위(동작)을 테스트 하기 쉽습니다.
- 고급 기능들과 함께 손 쉬운 통합이 가능합니다. 예를들어 로깅(logging) 또는 pull-to-refresh가 있습니다.
프로바이더 생성하기
다양한 프로바이더가 있지만, 기본적으로는 모두 동일한 방식으로 동작됩니다.
가장 보편적으로 사용하는 방법으로 전역 변수로 선언하여 사용하는 방법이 있습니다.
final myProvider = Provider((ref) {
return MyValue();
});
프로바이더를 글로벌한 전역변수로 사용하는것을 꺼려하지 않아도 됩니다.
프로바이더는 완전 immutable 특성을 가집니다.
프로바이더를 선언하는 것은 함수를 선언하는것과 다르지 않습니다.
그리고 프로바이더들은 테스트할 수 있고 유지보수 할 수 있습니다.
위에 코드에선 3개의 컴포넌트로 구성되어 있습니다.
- final myProvider
- 변수 선언 부분입니다.
- 이 변수는 항상 불변 특성을 가집니다.
- 추후 프로바이더의 상태를 읽이위해 사용하게 됩니다. - Provider
- 우리가 코드에서 사용하기 위해 결정한 프로바이더 입니다.
- Provider는 모든 프로바이더 종류중에 가장 기본입니다.
- 어떻게 상태값과 상호 작용하는지에 따라서 Provider를 다른 종류의 프로바이더로 사용하면 됩니다.
- 예를들어 StreamProvider 또는 StateNotifierProvider 가 있습니다. - (ref) {}
- 공유 상태를 생성하는 함수 입니다. (람다함수)
- 해당 함수는 ref객체를 파라미터로 받습니다.
- ref는 다른 프로바이더들을 읽기 위해서 사용하거나,
- 프로바이더의 상태가 소멸될 때 일부 작업을 수행할 수 있도록 해줍니다.
프로바이더 내부에서 생성되는 객체의 형태는 사용하는 프로바이더의 종류에 따라 다르게 생성됩니다.
예를 들어 Provider의 함수는 어떤 객체든 생성이 가능합니다.
반면에 StreamProvider는 Stream 객체를 생성할 필요가 있습니다.
프로바이더의 상태가 소멸되기 전에 액션 취하기
일부 상황에서, 프로바이더의 상태는 소멸되거나 재 생성될 수 있습니다.
통상적인 경우 이러한 상황들은 프로바이더 소멸상태전에 초기화를 진행하는 경우 입니다.
예를 들어 StreamController를 닫아주는 경우가 있습니다.
해당 작업은 ref객체의 onDispose 메소드에서 실행 합니다.
final example = StreamProvider.autoDispose((ref) {
final streamController = StreamController<int>();
ref.onDispose(() {
// 프로바이더의 상태가 소멸되기 전 StreamController를 닫습니다(close).
streamController.close();
});
return streamController.stream;
});
프로바이더 Modifiers
모든 프로바이더들은 다른 프로바이더와 추가적인 기능을 추가하기 위한 방법이 기본적으로 있습니다.
ref object에 새로운 특징을 추가하거나 프로바이더가 어떻게 상태를 소모하는지를 변경 가능합니다.
Modifiers는 모든 프로바이더에서 사용할 수 있습니다.
final myAutoDisposeProvider = StateProvider.autoDispose<int>((ref) => 0);
final myFamilyProvider = Provider.family<String, int>((ref, id) => '$id');
위에 코드에선 2개의 Modifiers가 있습니다.
.autoDispose : 더 이상 프로바이더를 구독하지 않을 때 자동으로 프로바이더를 소멸 시켜줍니다.
.family : 프로바이더에 외부 파라미터를 추가해서 생성할 때 사용합니다.
final userProvider = FutureProvider.autoDispose.family<User, int>((ref, userId) async {
return fetchUser(userId);
});
위에 코드처럼 여러 modifiers를 사용할 수 있습니다.
'Flutter > Riverpod' 카테고리의 다른 글
Flutter) Riverpod refresh / invalidate - 6 (0) | 2023.01.22 |
---|---|
Flutter) Riverpod Consumer 사용하기 - 5 (0) | 2023.01.22 |
Flutter) Riverpod watch,listen,read 사용하기 - 4 (0) | 2023.01.21 |
Flutter) Riverpod "ref" 얻기 - 3 (0) | 2023.01.21 |
Flutter) Riverpod 상태관리 시작해보기 - 1 (0) | 2023.01.21 |