티스토리 뷰
반응형
T of<T>(
BuildContext context, {
bool listen = true,
})
위젯 트리 상에서 가장 가까운 Provider를 얻어 그 값을 반환합니다.
만약 listen이 true이면, 이후 값의 변경이 위젯의 새로운 State.build를 트리거하고, StatefulWidget의 State.didChangeDependencies를 호출합니다.
listen: false는 State.initState 내부 또는 provider의 create 메서드 내에서 Provider.of를 호출할 수 있게 하기 위해 필요합니다.
Provider(
create: (context) {
return Model(Provider.of<Something>(context, listen: false));
},
)
구현
static T of<T>(BuildContext context, {bool listen = true}) {
assert(
context.owner!.debugBuilding ||
listen == false ||
debugIsInInheritedProviderUpdate,
'''
Tried to listen to a value exposed with provider, from outside of the widget tree.
This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.
To fix, write:
Provider.of<$T>(context, listen: false);
It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn't care about the value.
The context used was: $context
''',
);
final inheritedElement = _inheritedElementOf<T>(context);
if (listen) {
// bind context with the element
// We have to use this method instead of dependOnInheritedElement, because
// dependOnInheritedElement does not support relocating using GlobalKey
// if no provider were found previously.
context.dependOnInheritedWidgetOfExactType<_InheritedProviderScope<T?>>();
}
final value = inheritedElement?.value;
if (_isSoundMode) {
if (value is! T) {
throw ProviderNullException(T, context.widget.runtimeType);
}
return value;
}
return value as T;
}
요약
Provider.of<T>
는 위젯 트리에서 가장 가까운 Provider를 찾아 그 값을 반환합니다.listen
이 true이면, 값의 변경이 위젯의 재빌드를 트리거합니다.listen: false
는 State.initState나 provider의 create 메서드 내에서 Provider.of를 호출할 때 필요합니다.- 구현 코드에서는 컨텍스트와 관련된 여러 검사를 수행하며, 필요할 때 위젯 트리의 변경에 대한 의존성을 설정합니다.
- 값을 찾을 수 없거나 타입이 일치하지 않는 경우 예외를 발생시킵니다.
반응형
'Flutter > 상태 관리' 카테고리의 다른 글
플러터] Provider - read<T>() 메서드 (0) | 2024.07.02 |
---|---|
플러터] Provider - Provider 클래스 (0) | 2024.07.02 |
플러터] 상태 관리 (State management) (0) | 2024.07.02 |
플러터] Provider 패키지 README.md (0) | 2024.07.02 |
플러터] Provider - Selector<A, S> 클래스 (0) | 2024.07.02 |
댓글
공지사항