Flutter: GetX 상태관리
Flutter 개발을 하다 보면 점점 복잡한 상태 관리, 라우팅, 의존성 주입 등의 이슈들이 발생합니다.
이러한 문제를 간단한 문법으로 해결해 주는 라이브러리가 GetX입니다.
GetX에 대해 알아보겠습니다.
🚀 GetX
- GetX는 Flutter에서 가볍고 빠른 상태관리 도구 중 하나로,
단순한 상태관리부터 라우팅, 의존성 주입까지 가능한 솔루션입니다.
- 간단한 API: 간단하고 직관적인 API 제공 → 학습 곡선을 줄이고 빠른 개발을 가능하게 함 / 상태 관리를 위해 복잡한 코드를 작성할 필요가 없음
- 성능 최적화: 리액티브 프로그래밍을 지원하여 상태 변화 시에만 UI를 갱신 → 불필요한 리빌드 최소화 / 애플리케이션 성능 최적화
- 의존성 주입: 의존성 주입 기능 제공으로 객체의 생명주기 관리할 수 있음 → 의존성 관리와 객체 재사용성을 높여줌
- 라우팅 관리: 내장된 라우팅 기능을 통해 간편하게 내비게이션을 관리할 수 있음 → 코드의 가독성을 높이고 네비게이션을 보다 쉽게 처리할 수 있게 함
🚀 GetX 장점
장점 | 설명 |
퍼포먼스 | 불필요한 rebuild 최소화 (Obx, GetBuilder 분리 렌더링) |
코드량 감소 | 별도의 Provider, InheritedWidget 없이 상태관리 가능 |
통합 기능 | 상태 + 라우팅 + 의존성 주입까지 한번에 해결 |
러닝커브 낮음 | 문법이 매우 직관적 (초보자도 빠르게 적용 가능) |
🚀 GetX의 3대 핵심 기능
기능 | 설명 |
State Management | 반응형 상태관리 (.obs, update(), GetBuilder) |
Route Management | 간단한 라우팅, 네임드 라우트 지원 |
Dependency Injection | 전역 컨트롤러 관리, 서비스 주입 간편 |
🔧 GetX 설치
//Terminal 입력
flutter pub add get
//pubspec.yaml 확인
get: ^4.6.6
ㄴ pubspec.yaml 파일에서 위와 같이 보인다면 정상적으로 GetX가 설치된 것입니다.
🔧 GetX에서 Controller
- GetX에서 중앙 집중 상태는 컨트롤러(Controller)를 통해 관리됩니다.
이 컨트롤러는 앱 전체에서 접근 가능한 전역 상태 객체이며,
필요에 따라 최상위 위젯에서 Get.put()으로 등록하거나, 이후 특정 시점에 Get.lazyPut() 등을 통해 주입할 수 있습니다.
즉, 위젯 트리 하위에 직접 속한다기보다는 독립적으로 주입되어 앱 전역에서 재사용되는 상태 객체라고 이해하면 됩니다.
🔧 컨트롤러 등록
- 컨트롤러를 등록하기 위해서는 컨트롤러를 만들어줘야 합니다.
ㄴ 상태 컨트롤러 명명은 매우 중요하므로 어떤 상태를 관리할지 고려해서 명명하시기 바랍니다.
ㄴ 예) 상품관리컨트롤러: product_controller.dart
// 1.product_controller.dart 생성 > class ProductController {}
// 2.GetxController 상속
import 'package:get/get.dart';
class ProductController extends GetxController{}
ㄴ 이렇게 작성하면, 상태 관리를 할 수 있는 클래스가 되었습니다.
//의존성 주입 (↑상태 관리를 어디서든지 접근 가능하도록 등록)
//main.dart 파일 > build 함수 내 작성
Get.put(ProductController());
⚙️ GetX 상태관리 방식 3가지
방식 | 설명 | 특징 |
Obx | 반응형 변수 (.obs)를 이용 | 가장 간단하고 직관적 |
GetBuilder | 명시적으로 update() 호출 | 퍼포먼스 최적화 유리 |
GetX | 컨트롤러 타입을 명시 | 타입 안전, Rx 가능 |
// GetBuilder 사용 예시
GetBuilder<CounterController>(
builder: (controller) => Text('${controller.count}'),
);
⚙️ 간단한 라우팅 관리
Get.to(DetailPage()); // 다음 페이지 이동
Get.back(); // 이전 페이지로 돌아가기
Get.offAllNamed('/home'); // 모든 스택 제거하고 이동
// main.dart에서 라우트 등록
GetMaterialApp(
initialRoute: '/',
getPages: [
GetPage(name: '/', page: () => HomePage()),
GetPage(name: '/detail', page: () => DetailPage()),
],
);
⚙️ 의존성 주입
// Controller 등록
Get.put(CartController()); // 일반적인 주입
Get.lazyPut(() => CartController()); // 필요할 때 생성
Get.find<CartController>(); // 이미 등록된 컨트롤러 가져오기
//의존성 영구적 유지 설정
Get.put(ProductController(), permanent: true);
🚀 GetX 단점
단점 | 설명 |
구조적 제약 적음 | 너무 자유롭다보니 대형 프로젝트에서 설계가 무너지기 쉬움 |
예측 불가능성 | 무분별한 전역 변수 사용 시 디버깅 어려움 |
테스트성 | Bloc/Riverpod에 비해 테스트 구조 설계가 명확하지 않음 |
이러한 이유로 GetX는 소규모 앱이나 MVP 개발에는 최적이나
대규모 앱에서는 아키텍처 설계와 함께 신중히 사용하는 것이 좋습니다.