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 |