State:어떤 형태든 UI에 변화가 생기도록 영향을 미치는 데이터로 두 가지 종류가 존재한다.
flutter는 앱의 state가 바뀌면 hot reload를 통해 위젯트리를 rebuild된다.
setState는 위젯 Lifecycle에 build()를 다시 호출해 UI를 랜더링하게 하는 함수로 가장 간단하게 변화된 state를 UI에 반영할 수 있다.
plus 버튼과 minus 버튼을 눌러 plus point와 minus point 값을 올려주고 두 값을 더해 total score이 출력되는 프로그램
변수들은 MyPage에 존재하며 이 데이터가 바뀔 때마다 MyPage 밑의 모든 Widget들이 rebuild된다.
State Management
: 위젯 트리 상에서의 위치와 상관없이 데이터를 필요로 하는 위젯이 쉽게 데이터에 접근할 수 있어야 한다.
: 변화된 데이터에 맞추어 UI를 다시 그려줘야 한다.
provider는 상태를 관리하는 툴로 Widget에게 상태를 주입한다.
왜 사용할까?
1. 위젯이 쉽게 데이터에 접근할 수 있는 방법
2. 변화된 데이터에 맞춰서 UI를 다시 그려주는 기능
Provider 역시 하나의 위젯으로 위젯트리 상에서 일반 위젯과 똑같은 특성을 가지게 된다. Provider 위젯 또한 데이터를 필요로 하는 위젯들보다 항상 상위에 위치해야 한다.(?)
_needData = Provider.of<Data>(context)
_needData: 위젯이 전달받기를 원하는 데이터
Provider: 데이터를 보내주는 주체
of: 주어진 context를 거슬러 올라가면서 가장 가까이에 있는 원하는 타입의 인스턴스를 찾아서 반환하라는 함수
Data: 필요한 데이터 타입
context: 데이터를 보내주는 연결 통로, context와 연결된 Widget만 데이터를 보낼 수 있음
-> 이 과정을 통해 _needData 변수는 필요할 때마다 불러서 전달할 수 있는 데이터가 된다.
class MyApp extends StatelessWidget {
const MyApp({key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Provider(
create: (context) => DataProvider(),
child: PrintData()
);
}
}
Provider의 child가 된 PrintData아래의 모든 위젯에서 DataProvider 인스턴스에 접근할 수 있다.
state가 변경되었을 때 모든 위젯들이 rebuild 되는 것이 아닌 특정 위젯만이 rebuild 되어야 한다.
-> 특정 위젯만 state의 변화에에 귀를 기울이고 있으면 된다.
데이터의 정의를 담은 클래스에 with ChangeNotifier를 하여 ChangeNotifier 클래스를 연결시켜 줄 수 있다.
with ChangeNotifier
extends ChangeNotifier
데이터 변경시 리스너에게 notify 한다.(=알림을 제공해준다) 변화에 대해 구독할 수 있다.
참고: https://medium.com/@khkong0928/flutter-widget%EC%9D%98-%EB%B9%8C%EB%93%9C-%EA%B3%BC%EC%A0%95%EA%B3%BC-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC-%EB%B0%A9%EB%B2%95-%EC%86%8C%EA%B0%9C-552024bc6699\
https://www.youtube.com/watch?v=-3iD7f3e_SU