UI에서 실시간으로 변하는 여러 데이터들의 상태를 효율적으로 관리하기 위한 개념이다.
생산성
직관적인 코드로 간단하게 구현 가능.
성능과 최소한의 리소스 소비에 중점을 두기 때문에, Streams나 ChangeNotifier를 사용하지 않음.
View, 프레젠테이션 로직, 비즈니스로직, 종속성 주입 및 네비게이션을 완전히 분리하여 관리.
참고 문서 : https://pub.dev/packages/get/example
class InitBindings extends Bindings{
void dependencies(){
Get.put(CounterViewModel(), permanent: true);
}
}
return GetMaterialApp(
...
initialBinding: InitBindings(),
getPages: [
GetPage(
name: '/', page: () => const HomeView(),
transition: Transition.zoom),
]
);
class CounterViewModel with GetxController{
int _count = 0;
get count => _count;
void increase(){
_count++;
update();
}
}
GetBuilder<CounterViewModel>(
builder: (controller){
...
controller.increase();
return Text(controller.count);
}
)
CounterViewModel _counterViewModel = Get.put(CounterViewModel());
// 호출
_counterViewModel.increase();
class CounterViewModel with GetxController{
static CounterViewModel get to => Get.find();
...
}
// 호출
CounterViewModel.to.increase();
class HomeView extends GetView<CounterViewModel>{
// controller로 접근
// 호출
return Text(controller.count);
}
GetX<CounterViewModel>(
builder: (controller){
// count가 RxInt count = 0.obs인 경우
return Text(controller.count.value);
}
)
Obx( () => Text(controller.count.value) )
controller 안에서 onInit메서드를 override하고 그 안에 추가하여 사용한다.
Ever : 매번 변경 될 때 실행.
Once : 처음 변경 되었을 때만 실행.
Interval : 계속 변경이 있는 동안, 특정 지정 시간 인터벌이 지나면 실행.
Debounce : 인터벌이 끝나고 나서 특정 지정시간 이후에 한번만 실행.
class CounterViewModel with GetxController{
int _count = 0;
...
void onInit(){
once(_count, (_){
print('$_이 처음으로 변경 되었습니다.');
});
super.onInit();
}
}
Get.put -> Get.put(CounterViewModel());
// 일반적인 사용법.
Get.lazyPut -> Get.lazyPut<CounterViewModel>( () => CounterViewModel());
// 사용 될때만 호출된다.
Get.putAsync -> Get.putAsync<CounterViewModel>( () async{ return CounterViewModel(); } )
// 비동기식으로 데이터를 받아오거나 가공처리를 하기 위해 사용된다. 잘 사용되지 않는다.
Get.create -> Get.create<CounterViewModel>( ()=>CounterViewModel() );
// 매번 새로운 컨트롤러 인스턴스가 생성된다. 그렇기에 메모리 효율이 떨어질 것으로 보이며, 잘 사용되지 않는다.