베이비스푼을 개발하면서 상태관리 툴로 GetX를 사용했습니다.
오늘은 GetX를 사용하면서 자주 사용했던 용법들을 몇가지 정리해보려고 합니다.
(몇시간 정리했던 내용이 세션 만료로 인해 날아가는 불상사가 발생했네요 ㅠ,ㅠ)
1. Get.toNamed()
- Navigation.pushNamed() 동일
- GetPage()로 미리 등록해놓은 페이지의 name을 이용하여 Navigation Stack에 push 한다. 이후 Get.back()으로 이전 페이지로 돌아올 수 있다.
- arguments를 이용하여 필요한 정보를 전달하여 처리할 수 있다.
// toNamed 예제
Get.toNamed(Routes.SCREEN_HOME, arguments: {'isNewBaby': babyModel})
// arguments 예제
bool isNewBaby = Get.arguments['isNewBaby'] ?? false;
2. Get.offNamed()
- Navigation.pushReplacementNamed() 동일
- 현재 페이지를 pop 하고 등록되어 있는 page name을 호출하여 페이지 전환을 한다. Get.back()으로 이전 페이지로 돌아올 필요가 없는 경우 사용한다.
3. Get.back()
- Navigation.popUntil() 동일
- 현재 페이지, 팝업 다이얼로그, 스낵바, BottomSheet 등을 Navigation Stack에서 pop 한다.
4. Get.until()
- Navigation.popUntil() 동일
- Get.until() 함수에 정의된 조건이 만족될때까지 Navigation Stack의 페이지를 pop 한다.
- 아래와 같이 조건에 따라 라우팅할 수 있다.
if (Get.isRegistered<MainController>()) {
Get.until((route) => Get.currentRoute == Routes.BABY_LIST);
} else {
Get.offNamed(Routes.MAIN);
}
5. Get.put() / Get.lazyPut(), Get.find()
- GetX에서 지원하는 Dependency Injection 방법이다.
- 메모리에 클래스의 인스턴스를 주입합으로서 상태관리를 쉽게 사용할 수 있다.
- 메모리에 주입된 인스턴스 정보는 Get.find()를 통해 얻어올 수 있다.
// 인스턴스 저장
Get.put(babyModel);
Get.put(family, permanent: true);
// 인스턴스 조회
BabyModel beforeBaby = Get.find<BabyModel>();
FamilyModel familyModel = Get.find();
6. GetBuilder()
- StatefulWidget을 대신해 사용할 수 있으며 원하는 시점에 view를 update할 수 있다. reactive하지 않다는 점을 인지하며 사용해야 한다.
- GetBuilder의 id 값을 설정 할 수 있다. update 함수에 id 정보를 array로 설정하여 선택적으로 update 할 수 있다.
// GetBuilder 예제
Widget renderGetBuilderTest() {
return GetBuilder<HomeController>(
id: 'homeBody',
builder: (_) {
return Container(
child: renderBody(),
);
},
);
}
// update 예제
HomeController homeController = Get.find();
homeController.update(['homeBody']);
7. Obx
- Rx를 이용한 reactive 방식의 상태관리
- 선언 방식은 value.obs, Rx<Type>(Value), RxType(Value) 등이 있으며 주로 Value.obs 방식을 사용
- Rx로 선언된 변수를 Obx를 이용하여 반응형 위젯으로 설정하면 Rx변수가 변경되는것을 Obx가 인지하여 rebuild를 하기 때문에 변경사항이 즉시 반영된다.
// name 변수를 rx로 선언
RxString name = ''.obs;
// name 값을 변경
name.value = '메타코드';
// name 변수를 Obx로 반응형 위젯으로 설정
Obx(() => Text(
'${controller.name}',
style: const TextStyle(
color: Color(0xFF007AFF),
fontSize: 12,
),
),
),
베이비스푼에서의 상태관리는
위에서 정리한 6번 항목과 7번 항목과 같이 각 페이지의 특성에 맞게 Obx와 GetBuilder를 적절히 나눠서 사용하고 있습니다.
두가지 모두 사용해보니 무조건 어떤것을 사용한다기 보다는 페이지와 기능에 맞게 적절한곳에 알맞게 사용하는것이 필요한 것 같습니다.
이상으로 프로젝트에서 주로 사용하는 GetX 용법들 중 일부만 살펴보았습니다.
잘못되었거나 추가로 공유하면 좋겠는 내용들은 댓글로 남겨주세요 :)
'Development > Flutter' 카테고리의 다른 글
[해결방법] Flutter PackageName 변경, Flutter AppName 변경 (0) | 2023.02.07 |
---|---|
Flutter 앱에 Map 기능 추가하기 (MapBox, GoolgeMap) (0) | 2023.02.01 |
Flutter 3.3 릴리즈 관련 링크 (0) | 2022.11.18 |
[플러터 위젯] iOS widget에서 버튼 사용하기 (0) | 2022.07.07 |
[해결방법] 문제1. The MinCompileSdk (31) specified in, 문제2. The binary version of its metadata is 1.5.1, expected version is 1.1.15. (0) | 2022.05.06 |