상태 관리
GetX의 상태관리와 비슷한 라이브러리로 Provider가 있다.
상태 관리는 ui등과 같은 부분에 특정 값의 변화를 특정 시점에 반영 및 상태를 알려줄 수있다.
GetX의 반응형 상태관리
GetX의 기능을 사용하여 간결한 문법으로 값의 변경을 리액티브하게 반영할 수 있다.
리액티브 변수 선언
class ReactiveController {
RxInt num = 0.obs;
RxDouble _double = 0.0.obs;
RxString _string = "".obs;
RxList<int> _list = [0].obs;
Rx<Test> _object = Test(0, "").obs;
// 값 변경
void increaseValue() {
num++;
// == num(num.value+1);
}
// 객체의 내부의 값은 상태 변경 감지에 해당되지 않기때문에
// update()를 통해 값을 변경하고 작업이 끝나면 변경된 값의 상태를 반영한다.
void putNumber(int value) {
_object.update((val) {
// 변경 작업
});
}
}
다음과 같이 GetX의 리액티브한 변수를 선언할 수 있다.
상태 반영
@override
Widget build(BuildContext context) {
Get.put(ReactiveController());
return Container(
child: Obx(() {
final controller = Get.find<ReactiveController>();
return Text('${controller.num.value}');
}),
);
}
값들은 변경이 되면 다음과 같이 Obx 안에서 상태를 반영해줄 수 있다.
Rx변수의 경우 일반적인 상태 관리에서의 반영과는 다른점이 있는데
리액티브 변수의 값을 변경했을 때 값이 기존의 값과 같을 경우 변경 상태를 알리지 않는다.
GetxController의 생명주기 관리
class ReactiveController extends GetxController
...
@override
void onInit() {
// Controller 생성 시
super.onInit();
}
@override
void onClose() {
// Controller 제거 시
super.onClose();
}
@override
void onReady() {
// 1프레임 이후 (ui를 그리는 작업은 여기에)
super.onReady();
}
}
* 플러터에서 ui작업을 진행하기위해서는 렌더링 트리가 필요한데 onReady는 렌더링 트리가 완성된 후(1프레임) 에 실행되기때문에 다이얼로그나 스낵바 작업은 onReady에서 진행해야한다.
유용한 함수 (workers)
ever(num, (_) => print("$_ 상태 변경 시 마다 호출"));
once(num, (_) => print("$_ 첫 상태 변경 시 호출"));
debounce(num, (_) => print("$_ 지정 시간 내 마지막 값 호출"), time: const Duration(seconds: 1));
interval(num, (_) => print("$_ 상태 변경 시 지정 시간 간격으로 호출"), time: const Duration(seconds: 1));
GetX의 특별한 기능을 하는 worker이다.
지정한 값(예제에선 num)의 상태 변경을 감지하여 각 기능에 맞게 정의한 함수를 호출한다.
마찬가지로 같은 값으로 변경을 시도할 경우에는 호출이 되지않는다.
'Flutter' 카테고리의 다른 글
[Flutter] Dart에서 const와 final의 차이점 (0) | 2022.04.07 |
---|---|
[Flutter] GetX를 사용해야할 이유3 - 종속성 관리(의존성 주입, 바인딩) (1) | 2022.04.07 |
[Flutter] GetX를 사용해야할 이유1 - Route (0) | 2022.04.06 |
[Flutter] Flutter NaverMap 사용 (Null safety version) (0) | 2022.04.04 |
[Flutter] 간단한 Flutter 권한 요청 라이브러리 사용 (with. permission_handler) (0) | 2022.04.04 |