티스토리 뷰
반응형
Provider 클래스는 생성(Create) 및 해제(Dispose)를 통해 제공하는 값의 생명주기를 관리하는 Provider입니다. 주로 BLoC와 같은 간단한 작업을 위해 StatefulWidget을 만드는 것을 피하고자 할 때 사용됩니다.
Provider는 State.initState와 State.dispose의 조합과 같습니다. Create는 State.initState에서 단 한 번 호출됩니다. InheritedWidget은 값이 생성자 초기화 및 final이어야 하므로 사용할 수 없습니다.
다음 예시는 Model을 한 번 인스턴스화하고 Provider가 트리에서 제거될 때 이를 해제하는 예제입니다:
class Model {
void dispose() {}
}
class Stateless extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<Model>(
create: (context) => Model(),
dispose: (context, value) => value.dispose(),
child: ...,
);
}
}
create 콜백은 지연 호출된다는 점에 유의해야 합니다. 이는 Provider가 위젯 트리에 삽입된 처음이 아닌 값이 처음 읽힐 때 호출됩니다.
이 동작은 lazy: false
를 Provider에 전달하여 비활성화할 수 있습니다.
테스트
Provider를 소비하는 위젯을 테스트할 때는 테스트할 위젯 위에 적절한 Provider를 위젯 트리에 추가해야 합니다.
일반적인 테스트 예시는 다음과 같습니다:
final foo = MockFoo();
await tester.pumpWidget(
Provider<Foo>.value(
value: foo,
child: TestedWidget(),
),
);
이 예시에서는 객체 타입을 명시적으로 지정했습니다. 모의 클래스를 사용했기 때문에(일반적으로 mockito 사용), 모의 객체를 모의 클래스 타입으로 다운캐스트해야 합니다. 그렇지 않으면 타입 추론이 Provider로 해석되어 Provider.of가 실패할 수 있습니다.
생성자
- Provider({Key? key, required Create<T> create, Dispose<T>? dispose, bool? lazy, TransitionBuilder? builder, Widget? child}) : 값을 생성하고 이를 저장하여 하위 위젯에 노출합니다.
- Provider.value({Key? key, required T value, UpdateShouldNotify<T>? updateShouldNotify, TransitionBuilder? builder, Widget? child}) : 기존 값을 해제하지 않고 노출합니다.
속성
- builder → TransitionBuilder?: 제공자를 읽을 수 있는 BuildContext를 얻기 위한 구문 설탕.
- hashCode → int: 객체의 해시 코드.
- key → Key?: 트리에서 한 위젯이 다른 위젯을 대체하는 방법을 제어.
- runtimeType → Type: 객체의 런타임 타입 표현.
메서드
- build(BuildContext context) → Widget: 이 위젯이 표현하는 사용자 인터페이스의 일부를 설명.
- buildWithChild(BuildContext context, Widget? child) → Widget: 추가 child 매개변수를 받는 빌드 메서드.
- createElement() → _InheritedProviderElement: 이 위젯의 위치를 관리할 StatelessElement를 생성.
- debugDescribeChildren() → List: 이 노드의 자식을 설명하는 DiagnosticsNode 객체의 리스트 반환.
- debugFillProperties(DiagnosticPropertiesBuilder properties) → void: 노드와 관련된 추가 속성 추가.
- noSuchMethod(Invocation invocation) → dynamic: 존재하지 않는 메서드나 속성에 접근할 때 호출.
- toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode: 객체의 디버그 표현을 반환.
- toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) → String: 객체의 문자열 표현.
- toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String: 이 노드와 자손의 문자열 표현 반환.
- toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String: 객체의 한 줄 상세 설명 반환.
- toStringShort() → String: 이 위젯의 짧은 텍스트 설명.
연산자
- operator ==(Object other) → bool: 동등 연산자.
정적 속성
- debugCheckInvalidValueType ↔ (void Function(T value)?): Provider의 잘못된 사용을 방지하기 위한 무결성 검사.
정적 메서드
- of(BuildContext context, {bool listen = true}) → T: 위젯 트리에서 가장 가까운 Provider를 찾아 그 값을 반환.
반응형
'Flutter > 상태 관리' 카테고리의 다른 글
플러터 ChangeNotifierProvider 완전 정복 (1) | 2024.07.03 |
---|---|
플러터] Provider - read<T>() 메서드 (0) | 2024.07.02 |
플러터] Provider - Provider.of 정적 메서드 (0) | 2024.07.02 |
플러터] 상태 관리 (State management) (0) | 2024.07.02 |
플러터] Provider 패키지 README.md (0) | 2024.07.02 |
댓글
공지사항