티스토리 뷰

반응형

외부 값과 동기화된 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

반응형
댓글
공지사항