단순 카운팅 앱에서 Provider와 GetX의 상태관리를 비교하여 확인해봅시다.
class manager extends statefulWidget{
~
~
@override
Widget build(BuildContext context){
Get.put(CountGetx()); //어디에나 선언 가능
return Scaffold(
body: Column(
children : [
WithGetX(),
ChangeNotifierProvider<CountProvider>(
create: (_)=>CountProvider(),
child:WithProvider()
)
]
)
);
class CountProvider extends ChangeNotifier{
int count =0;
void increase(){
count++;
notifyListeners();
}
}
Class WithProvider extends StatelessWidget {
~
~
@overide
Widget build(BuildContext context){
return Column(
children:[
Consumer<CountProvider>(
builder: (_,snapshot,child),{
return Text("${snapshot.count}")
}
),
RaisedButton(
child:Text("+"),
onPressed: (){
//listen:true는 전체가 빌드 됨
Provider.of<CountProvider(context,listen:false)
.increase();
}
)
]
);
}
class CountGetx extends GetxController{
int count =0;
void increase(){
count++;
update();
}
}
Class WithGetx extends StatelessWidget {
~
~
//최상단 파일 대신 이곳에 선언도 가능하다.
// CountGetx _controllerWithGetx = Get.put(CountGetx());
@overide
Widget build(BuildContext context){
return Column(
children:[
GetBuilder<CountGetx>(
builder: (controller),{
return Text("${controller.count}")
}
),
RaisedButton(
child:Text("+"),
onPressed: (){
Get.find<CountGetx>().increase();
//이곳에 선언하면 find를 할 필요가 없어짐
//_controllerWithGetx.increase();
}
)
]
);
}
프로바이더는 context의 영향을 받기 때문에 버튼을 위젯으로 빼는 경우 stl -> stf 위젯으로 변경하거나 context를 전달해야함.
Getx는 선언이 자유롭고 context의 영향을 받지 않음.
Getx에서의 더 큰 장점은 GetBuilder에 id를 부여하여 하나의 컨트롤러를 다르게 보고 따로 상태 관리를 할수 있다.