https://pub.dev/packages/provider
flutter pub add provider
프로바이더는 위젯 트리와 상관없이 상태를 저장할 수 있게 해주는 상태 관리 라이브러리이다.
상태를 공유하는 공통 부모 위젯에 Provider를 제공하고, 상태를 사용하는 위젯에서는 Provider의 데이터를 읽어서 사용한다.
불필요한 위젯들이 rebuild 됨을 방지할 수 있다. 
watch : 해당 위젯이 상태값의 변경을 감지한다.
read : 상태값을 읽으나 변경을 감시하지 않는다.
select : 특정 상태값만을 감시한다.
일반적으로 프로바이더의 값을 변경하기 위한 함수는 read를 통해 접근하고, 상태값을 사용할 때는 watch를 사용한다.
프로바이더를 사용하려면 ChangeNotifier를 사용해 클래스를 생성해야 한다.
counts_provider.dart
class Counts with ChangeNotifier {
  int _count = 0; // 전역 변수
  int get count => _count; // 외부에서 접근할 수 있도록 getter 생성
  void add() {
    _count++;
    notifyListeners(); // 데이터가 갱신되었음을 알려줌
  }
  void remove() {
    _count--;
    notifyListeners();
  }
}
main.dart
void main() {
  runApp(
    MaterialApp(
        home: ChangeNotifierProvider( // 최상단에 Provider 제공
      create: (_) => Counts(),
      child: const MyApp(),
    )),
  );
}
class MyApp extends StatefulWidget {
  const MyApp({super.key});
  @override
  State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
	@override
    Widget build(BuildContext context) {
		return Scaffold(
        	body: Column(
            	children: [
                	TextButton(
                    	onPressed: () {
                        	context.read<Counts>().add();
                        },
                        child: Text("add count")
                    ),
                    Text(context.watch<Counts>().count.toString())
                ]
            )
        )
    }
}