[Flutter] GetX - get.put()과 get.find()의 차이에 대해 알아보자

2023. 7. 13. 14:58·🐦 플러터

GetX

 

GetX는 Flutter의 대표적인 상태관리 툴 중 하나로, 사람들 사이에서 가장 대중적이기도 하고, 많이 쓰이는 상태관리 툴입니다.


Get.find()? Get.put()?

 

GetX에 대해서 잘 모를 때, GetX 컨트롤러를 잘 생성하고 그 컨트롤러를 뷰파일에 불러와서 사용하려 할 때 항상 궁금했던 점이 있었습니다. Get.find와 Get.put의 차이가 뭘까? 라는 궁금증이었는데요. 예를 들어서 이전에 만들었던 AuthController를 뷰파일에 불러와서 사용하려 할 때 final authController = Get.put(AuthController()); 로 불러오든, final authController = Get.find(); 로 불러오든, 불러온 컨트롤러를 활용할 수 있는 건 똑같습니다. 그럼 두 메소드의 차이는 뭘까요?

 

두 메소드의 차이는 사용하려는 컨트롤러가 인스턴스화 되어 있냐 없냐에 따라 달라집니다.

 

Get.put()을 통해서 컨트롤러를 인스턴스화할 수 있습니다.

반면에 Get.find()는 이미 인스턴스화 되어있는 컨트롤러는 단지 말 그대로 찾아서 불러오는 것 뿐인거죠.

 

Get.put<S>(
  // 필수: cotroller나 어떤것이든 get에 저장하려는 클래스  
  // 주석: "S"는 모든 유형의 클래스가 가능합니다.
  S dependency

  // 선택: 동일한 유형의 여러 클래스를 사용하기를 원하면
  // 일반적으로 Get.find<Controller>() 로 클래스를 가져오므로
  // 어떤 인스턴스인지 구분을 위해 tag를 사용해야합니다.
  // 고유한 string 이여야 합니다.
  String tag,

  // 선택: 기본적으로 get은 더이상 사용하지 않는 인스턴스는 dispose 합니다. by default, get will dispose instances after they are not used anymore (example,
  // (예를 들어 뷰의 controller가 닫힌 경우) 하지만 sharedPreferences와 같은 인스턴스는 앱 전체에서 유지되어야 할 필요가 있습니다.
  // 이런 경우 사용합니다.
  // 기본값은 false
  bool permanent = false,

  // 선택: 테스트에서 추상 클래스를 사용한 후에 다른 클래스로 교체하고 테스트를 수행합니다.
  // 기본값은 false
  bool overrideAbstract = false,

  // 선택: 자체 종속성 대신에 함수로 종속성을 생성합니다.
  // 이것은 일반적으로 사용되지 않습니다.
  InstanceBuilderCallback<S> builder,
)
final controller = Get.find<Controller>();
// OR
Controller controller = Get.find();

// Get은 controller를 찾아 가져다 줍니다.
// Get은 백만개의 contrller를 인스턴스화해서 가질수 있고 항상 올바르게 전달해 줍니다.

 

사실, GetX 잘 모를 때는 Get.put(), Get.find() 신경 안쓰고 그냥 계속 Get.put()으로 컨트롤러 불러오고 그랬었는데, 아마도 이미 인스턴스화 되어있는 녀석을 다시 인스턴스화 한다고 해서 에러가 발생하진 않겠지만, 그만큼 메모리 소모가 더 클 거라고 생각이 드네요.

 

따라서, 보통 binding을 통해서 먼저 Get.put으로 사용하는 컨트롤러들을 등록해놓고, 이후에 각 상황에 맞게 컨트롤러들을 Get.find로 불러와서 사용하게 됩니다.

 

아래는 Get.put과 Get.find를 사용하는 간단한 counter 앱의 예시 코드입니다 :

 

GetxController로 count를 계산할 수 있는 컨트롤러 파일을 하나 생성합니다.

// counter_controller.dart 파일
import 'package:get/get.dart';

class CounterController extends GetxController {
  RxInt count = 0.obs;

  void increment() {
    count++;
  }
}

 

Get.put()를 사용하여 앱이 시작될 때 메인 파일에서 CounterController를 인스턴스화 해줍니다.

// main.dart 파일
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:your_app_name/counter_controller.dart';
import 'counter_page.dart'; // 다음 예제에서 작성할 예정입니다.

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'GetX Counter Example',
      home: CounterPage(),
      initialBinding: BindingsBuilder(() {
        Get.put(CounterController());
      }),
    );
  }
}

 

이제 CounterPage 위젯에서 Get.find()를 사용하여 이미 생성된 CounterController 인스턴스를 찾아올 수 있습니다.

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:your_app_name/counter_controller.dart';

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final CounterController _counterController = Get.find();

    return Scaffold(
      appBar: AppBar(title: Text("GetX Counter")),
      body: Center(
        child: Obx(() => Text("Count: ${_counterController.count.value}")),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _counterController.increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

 

이처럼 GetX를 사용하면 의존성 주입을 효과적으로 관리할 수 있으며, Get.put()와 Get.find()를 통해 해당 인스턴스를 손쉽게 생성, 관리, 사용할 수 있습니다.


나중에 다시 한번 GetX의 의존성 주입 과정에 대해 자세히 적어볼 기회가 있으면 적어보도록 하겠습니다 😀

저작자표시 비영리 동일조건 (새창열림)

'🐦 플러터' 카테고리의 다른 글

[Flutter] 고객센터 (이메일 보내기) 기능 구현하기  (0) 2023.09.13
[Flutter] exception in phase 'semantic analysis' in source unit 'BuildScript' Unsupported class file major version 64  (0) 2023.09.13
[Flutter] pub.dev LIKES 부동의 1위, GetX의 상태관리  (0) 2023.07.11
[Flutter] Chewie 패키지를 사용해서 비디오 플레이어를 활용해보자  (0) 2023.06.22
[Flutter] Just_audio 패키지를 사용해서 음악을 삽입해보자  (2) 2023.06.21
'🐦 플러터' 카테고리의 다른 글
  • [Flutter] 고객센터 (이메일 보내기) 기능 구현하기
  • [Flutter] exception in phase 'semantic analysis' in source unit 'BuildScript' Unsupported class file major version 64
  • [Flutter] pub.dev LIKES 부동의 1위, GetX의 상태관리
  • [Flutter] Chewie 패키지를 사용해서 비디오 플레이어를 활용해보자
기멘기
기멘기
Handong Global University | Apple Developer Academy @ POSTECH
  • 기멘기
    현기의 비공식문서 🍎
    기멘기
  • 전체
    오늘
    어제

  • 링크

    • Github
    • Instagram

    • 전체 글 (87)
      • 🍎 iOS (7)
        • 애플 디벨로퍼 아카데미 (7)
      • 🐦 플러터 (32)
      • 🤔 컴공 지식 (10)
        • 알고리즘 (3)
        • 네트워크 (7)
      • 🔥 문해력 상승 (8)
        • 백 준 (8)
        • 프로 그래머 스 (0)
      • 💬 이모저모 (12)
        • CRA 방학 프로젝트 (4)
        • 캡스톤 산학 프로젝트 (5)
        • PARD IT 협업 동아리 (2)
      • 💡 인사이트 (0)
        • 전공 관련 (0)
        • 기타 (0)
      • ✏️ 하루 회고 (TIL) (11)
      • 🔍 ETC (7)
        • HTML-CSS-JS (4)

  • 인기 글


  • 최근 댓글


  • 최근 글


  • 블로그 메뉴

    • 티스토리 홈
    • 블로그 관리
    • 글 작성하기

  • hELLO· Designed By정상우.v4.10.3
기멘기
[Flutter] GetX - get.put()과 get.find()의 차이에 대해 알아보자
상단으로

티스토리툴바