hoony's web study

728x90
반응형

이번에 토이프로젝트를 하나 진행하면서 알게된 GetX 프레임워크에서 사용하는 Get.put, Get.find에 대한 것을 정리하고자 이렇게 포스팅을 합니다. 

Get.put과 Get.find는 의존성주입(Dependency Injection)과 상태 관리를 위해 사용되는 두 가지 핵심 메서드 입니다. 
이들의 차이점을 기능, 사용 시점, 동작 방식 측면에서 한번 정리해볼께요 .

1. Get.put

정의

  • Get.put<T>(T dependency, {String? tag})는 새로운 인스턴스를 생성하고 GetX의 의존성 관리 시스템에 등록합니다.
  • 컨트롤러, 서비스, 또는 기타 객체를 메모리에 저장해 다른 곳에서 재사용할 수 있게 합니다.

주요 특징

  • 인스턴스 생성 및 등록:
    • Get.put을 호출하면 지정된 타입의 새 인스턴스가 생성되고, GetX의 전역 스토리지에 저장됩니다.
  • 단일 인스턴스(Singleton):
    • 기본적으로 동일한 타입의 인스턴스는 하나만 유지됩니다(싱글톤 패턴). 동일한 타입으로 Get.put을 다시 호출하면 기존 인스턴스를 덮어씁니다(새로 생성).
  • 태그 옵션:
    • tag 파라미터를 사용하면 같은 타입의 여러 인스턴스를 구분해 저장할 수 있습니다.

example 

class ThemeController extends GetxController {
  RxBool isDarkMode = false.obs;
  void toggleTheme(bool value) => isDarkMode.value = value;
}

void main() {
  Get.put(ThemeController()); // ThemeController 인스턴스 생성 및 등록
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(home: HomePage());
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final ThemeController controller = Get.find(); // 등록된 인스턴스 가져오기
    return Scaffold(
      body: Obx(() => Switch(
        value: controller.isDarkMode.value,
        onChanged: controller.toggleTheme,
      )),
    );
  }
}

언제 사용?

  • 앱 시작 시(main.dart) 또는 특정 페이지에서 처음 컨트롤러를 초기화할 때.
  • 단일 인스턴스를 전역적으로 관리하고 싶을 때.

2. Get.find

정의

  • Get.find<T>({String? tag})Get.put으로 이미 등록된 인스턴스를 찾아 반환합니다.
  • 새로운 인스턴스를 생성하지 않고, 기존에 등록된 객체를 가져옵니다.

주요 특징

  • 인스턴스 검색:
    • GetX의 의존성 스토리지에서 해당 타입(T)의 인스턴스를 찾음.
  • 등록 필요:
    • Get.put으로 미리 등록되지 않은 경우 Get.find를 호출하면 Get.lazyPut이나 Get.put이 호출되지 않았다는 오류("Get.find() failed to find an instance")가 발생합니다.
  • 태그 사용:
    • tag를 지정해 특정 인스턴스를 찾을 수 있음.

언제 사용?

  • 이미 등록된 컨트롤러나 서비스를 가져와야 할 때.
  • 위젯 트리 내에서 동일한 인스턴스를 재사용할 때.

3. 주요 차이점 요약

항목 Get.put Get.find
기능 인스턴스를 생성하고 등록 등록된 인스턴스를 검색
인스턴스 생성여부 새 인스턴스 생성 생성하지 않음, 기존 인스턴스 반환
호출 시점 페이지 진입시 필요할 때 찾아서 사용
오류 발생조건 동일 타입 중복 등록시 덮어씀  등록되지 않은 것을 호출할때
태그 사용 tag로 구분해 여러 인스턴스 등록 가능 tag로 특정 인스턴스 검색 가능
사용 목적 의존성 주입 시작 의존성 재사용

tag로 사용하는 것은 저도 해본적이 없어서 예시만 가져와 볼께요 .

void main() {
  Get.put(ThemeController(), tag: 'light'); // 라이트 테마 컨트롤러
  Get.put(ThemeController(), tag: 'dark');  // 다크 테마 컨트롤러
  runApp(MyApp());
}

class HomePage extends StatelessWidget {
  final lightController = Get.find<ThemeController>(tag: 'light');
  final darkController = Get.find<ThemeController>(tag: 'dark');
  @override
  Widget build(BuildContext context) => Scaffold(body: Text('Dual Theme'));
}

4. 결론

  • Get.put: 의존성을 초기화하고 등록하는 시작점.
  • Get.find: 이미 등록된 의존성을 가져와 재사용.
  • 프로젝트에서 컨트롤러를 전역적으로 관리하려면 main.dart에서 Get.put으로 등록하고, 각 페이지에서 Get.find로 호출하는 패턴이 일반적입니다.

 

오랜만에 Flutter 를 가지고 토이 프로젝트를 진행하면서 한번더 정리해보는 시간이었습니다. 

이번에 앱을 또 출시하게 되면 포스팅하겠습니다. 
다운로드와 많은 응원 부탁드릴께요 ^^ 

728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading