<aside> 💡 InheritedWidget 을 가용성과 재사용성을 높일 수 있게 해주는 wrapper 플러그인
</aside>
InheritedWidget을 직접 사용하지 않고 Provider를 이용하면 얻을 수 있는 이점은 다음과 같다.
프로바이더 생성 방법은 2가지가 있다.
생성자를 통한 방법
ProxyProvider를 사용해야 한다.Provider(
create: (_) => MyModel(),
child: ...
)
// 주의
Person person = Person();
ChangeNotifierProvider<Person>(
create: (_) => person; // bad!
)
//주의
int count;
Provider(
create: (_) => MyModel(count),
child: ...
)
int count;
ProxyProvider0(
update: (_, __) => MyModel(count),
child: ...
)
Provider.value를 통한 방법 (value 생성자 라고도 함)
MyModel model = MyModel();
ChangeNotifierProvider.value(
value: MyModel(),
child: ...
)
// this is bad!
// everytime this widget is rebuilt, it will create a new instance of `Person` and every new instance of Person will trigger a rebuild in _every_ widget reading this value.
ChangeNotifierProvider.value(
value: Person(),
child: ...
)
//사용례
class PersonsNameLabel extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<String>.value(
value: Provider.of<Person>(context).name,
builder: (BuildContext context, Widget child) {
return Text(context.watch<String>());
},
);
}
}
기본적으로 create와 update 콜백은 lazy loading은 true 이며 따로 설정해줄 수 있다.
MyProvider(
create: (_) => Something(),
lazy: false,
)
BuildContext 객체의 확장 메소드를 제공하며, 이를 통해 값을 쉽게 읽어올 수 있다.
Provider.of<T>(context, listen: ture / false)) 를 간결화 한 메소드이다.
context.read<T>()
StatelessWidget.build 나 State.build 내부에서 호출할 수 없다.