티스토리 뷰

반응형

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를 찾아 그 값을 반환.
반응형
댓글
공지사항