티스토리 뷰
외부 값과 동기화된 ChangeNotifier를 생성하고 동기화하는 ChangeNotifierProvider입니다.
ChangeNotifierProvider의 이 변형을 더 잘 이해하려면 다음의 코드를 살펴볼 수 있습니다.
ChangeNotifierProvider(
create: (context) {
return MyChangeNotifier(
myModel: Provider.of<MyModel>(context, listen: false),
);
},
child: ...
)
이 예제에서는 MyModel이라는 다른 제공자(provider)에서 가져온 값을 사용하여 MyChangeNotifier를 생성했습니다.
이 방법은 MyModel이 절대 변하지 않는 한 작동합니다. 하지만 MyModel이 업데이트되면, 우리의 ChangeNotifier는 이에 따라 업데이트되지 않습니다.
이 문제를 해결하기 위해 다음과 같이 이 클래스를 사용할 수 있습니다:
ChangeNotifierProxyProvider<MyModel, MyChangeNotifier>(
create: (_) => MyChangeNotifier(),
update: (_, myModel, myNotifier) => myNotifier
..update(myModel),
child: ...
);
이 상황에서 MyModel이 업데이트되면 MyChangeNotifier도 이에 따라 업데이트될 수 있습니다.
이제 MyChangeNotifier가 더 이상 생성자에서 MyModel을 받지 않습니다. 대신 사용자 정의 setter와 메서드를 통해 전달됩니다.
이러한 MyChangeNotifier의 일반적인 구현은 다음과 같습니다.
class MyChangeNotifier with ChangeNotifier {
void update(MyModel myModel) {
// myModel에 기반하여 `notifyListeners`를 호출할 수 있는 사용자 정의 작업 수행
}
}
[X] 업데이트 메서드 내에서 ChangeNotifier를 직접 생성하지 마세요. 이렇게 하면 사용된 값이 업데이트될 때 상태가 손실될 수 있습니다. 또한 이전 알림자를 폐기하고 새 알림자를 구독하는 불필요한 오버헤드가 발생합니다. 대신 이전 인스턴스를 재사용하고 일부 속성을 업데이트하거나 메서드를 호출하세요.
ChangeNotifierProxyProvider<MyModel, MyChangeNotifier>(
// 상태가 의도치 않게 파괴될 수 있습니다.
update: (_, myModel, myNotifier) => MyChangeNotifier(myModel: myModel),
child: ...
);
[O] 가능하다면 ProxyProvider를 사용하세요. 생성된 객체가 HTTP 호출이나 유사한 부작용 없이 다른 객체의 조합일 뿐이라면, ProxyProvider를 사용하여 구축된 불변 객체가 작동할 가능성이 높습니다.
생성자
ChangeNotifierProxyProvider({Key? key, required Create create, required ProxyProviderBuilder<T, R> update, bool? lazy, TransitionBuilder? builder, Widget? child})서브클래스를 위한 키를 초기화합니다.
속성
builder → TransitionBuilder?
생성된 제공자를 읽을 수 있는 BuildContext를 얻기 위한 문법 설탕입니다.
final inherited
hashCode → int
이 객체의 해시 코드입니다.
no setter inherited
key → Key?
트리에서 하나의 위젯이 다른 위젯으로 교체되는 방법을 제어합니다.
final inherited
runtimeType → Type
객체의 런타임 유형을 나타냅니다.
no setter inherited
메서드
build(BuildContext context) → Widget
이 위젯이 표현하는 사용자 인터페이스의 일부를 설명합니다.
inherited
buildWithChild(BuildContext context, Widget? child) → Widget
추가 자식 매개변수를 받는 빌드 메서드입니다.
inherited
createElement() → _InheritedProviderElement
이 위젯의 위치를 관리할 StatelessElement를 생성합니다.
inherited
debugDescribeChildren() → List
이 노드의 자식을 설명하는 DiagnosticsNode 객체 목록을 반환합니다.
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
노드와 관련된 추가 속성을 추가합니다.
inherited
noSuchMethod(Invocation invocation) → dynamic
존재하지 않는 메서드나 속성에 접근할 때 호출됩니다.
inherited
toDiagnosticsNode({String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode
디버깅 도구와 DiagnosticsNode.toStringDeep에서 사용하는 객체의 디버그 표현을 반환합니다.
inherited
toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) → String
이 객체의 문자열 표현입니다.
inherited
toStringDeep({String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String
이 노드와 그 자손의 문자열 표현을 반환합니다.
inherited
toStringShallow({String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String
객체의 한 줄 상세 설명을 반환합니다.
inherited
toStringShort() → String
이 위젯의 짧은 텍스트 설명입니다.
inherited
연산자
operator ==(Object other) → bool
동등 연산자입니다.
inherited
'Flutter > 상태 관리' 카테고리의 다른 글
플러터] Provider - Selector<A, S> 클래스 (0) | 2024.07.02 |
---|---|
플러터] Provider - Consumer 클래스 (0) | 2024.07.01 |
플러터] Provider - ChangeNotifierProvider 클래스 (0) | 2024.07.01 |
플러터] Provider에 등록된 상태에 접근하는 방법들 (0) | 2023.07.13 |
플러터] ChangeNotifierProvider와 Selector, Navigator 예제 코드 (0) | 2023.07.12 |