Provider 는 InheritedWidget을 간편화한 wrapper 위젯 입니다.
플러터 상태 관리에서
StatefulWidget
다음으로 많이 쓰는 위젯입니다.
대체재로
get_it
이라는 신묘한 것이 있지만 완전히 대체하기에는 많이 뒤처져 있는 것으로 보입니다.
단순한 상태 관리를 넘어서 디자인 패턴, 아키텍쳐까지 보자면
Bloc, MobX, Redux
가 있습니다.
이 3개는 매우 강력한 기능과 고유한 특징(철학)도 가지고 있어서 충분히 배울만한 가치가 있습니다.
잠깐 좀 더 Provider 편을 들자면 앞의 2개는 내부적으로 결국 Provider를 사용하고 있고,
Redux 는 업데이트가 작년 12월 4일 이후로 없습니다.
현 시점 기준으로
패키지 사용자 수가 충분하고, open issue 11개 중에 버그가 단 하나도 없어서 (enhancement 9개, question 1, discussion 1) 별 걱정 없이 사용해도 되는 것으로 보입니다.
플러터 상태관리에 대해서 설명할 때 빠질 수 없는 Provider를 이 블로그에서도 다룬 적이 있습니다.
Flutter provider 1
/
Consumer
/
Selector
이 글이 쓰인 시점에는 플러그인 메이저 버전이 3이었기 때문에 지금과 꽤 많은 차이가 생겼습니다.
눈에 띄는 변화들만 정리하겠습니다.
단순히 이름만 바뀐게 아니라 create/update 콜백은 lazy-loaded 되는 것으로 바뀌었습니다.
이제 Provider가 만들어질 때 create가 호출되는게 아니라 처음 값이 읽어질 때 create 콜백이 호출됩니다.
이 기능을 끄려면 Provider lazy 매개변수에 false를 주면 됩니다.
FutureProvider( create: (_) async => doSomeHttpRequest(), lazy: false, child: ... )
watch, read는 Provider 공식 예제 에 사용법이 잘 나와있습니다.
select는 이렇게 사용합니다.
Widget build(BuildContext context) { final name = context.select((Person p) => p.name); return Text(name); }
그 밖에도 위젯의 추가/제거가 있었지만 기본적인 틀은 동일합니다.