[GetX] 종속성 관리

2022-01-24 hit count image

Flutter에서 GetX를 사용하여 종속성을 관리하는 방법에 대해서 알아봅시다.

개요

이번 블로그 포스트에서는 GetX를 사용하여 종속성을 관리하는 방법에 대해서 알아보도록 하겠습니다.

블로그 시리즈

이 블로그 포스트는 Flutter에서 GetX를 사용하는 방법에 관해 시리즈로 제작되었습니다. GetX의 다른 사용법을 알고 싶으시다면, 다음 링크를 참고하시기 바랍니다.

GetX 설치

Flutter에서 GetX의 사용법을 확인하기 위해 다음 명령어를 사용하여 Flutter의 새로운 프로젝트를 생성합니다.

flutter create dependency_management

그런 다음 명령어를 실행하여 GetX 패키지를 설치합니다.

flutter pub add get

이제 이렇게 설치한 GetX를 사용하여 종속성 관리를 하는 방법에 대해서 알아보도록 하겠습니다.

Get.put

일반적으로 GetX에서 종속성을 관리하기 위해서 다음과 같이 Get.put을 사용합니다.

Get.put(CountController());

Get.put으로 추가한 컨트롤러를 다음과 같이 변수에 할당하여 사용할 수 있습니다.

final controller = Get.put(CountController());
...
print(controller.count.value);
...
controller.increment();

Get.lazyPut

Get.put을 사용하여 컨트롤러를 추가하면, 해당 코드가 실행되는 시점에 컨트롤러가 메모리에 생성되게 됩니다. 하지만 다음과 같이 Get.lazyPut을 사용하면, 실제로 컨트롤러를 사용하는 시점에 컨트롤러가 메모리에 생성되게 됩니다.

Get.lazyPut<CountController>(() => CountController());

Get.putAsync

추가하려는 컨트롤러가 Future를 반환하는 경우, 다음과 같이 Get.putAsync을 사용하여 비동기 컨트롤러를 처리할 수 있습니다.

Get.putAsync<CountController>(() async => await CountController());

Get.find

Get.put, Get.lazyPut, Get.putAsync을 사용하여 컨트롤러를 추가하면, 다음과 같이 Get.find를 사용하여 추가한 컨트롤러를 찾아서 사용할 수 있습니다.

final controller = Get.find<CountController>();
...
print(controller.count.value);
...
controller.increment();

화면 이동시 종속성 주입

다음과 같이 Get.to으로 화면을 이동할 때 binding을 사용하여 컨트롤러를 생성, 주입할 수 있습니다.

Get.to(Second(), binding: BindingsBuilder(() {
  Get.put(CountController());
}));

또는 다음과 같이 Get.toNamed에서도 사용할 수 있습니다.

Get.toNamed('/second', binding: BindingsBuilder(() {
  Get.put(CountController());
}));

라우트에서 종속성 주입

다음과 같이 GetPage에서 binding을 사용하여 컨트롤러를 생성, 주입할 수 있습니다.

getPages: [
  GetPage(name:"/", page: () => Home()),
  GetPage(name:"/second", page: () => Second(), binding: BindingsBuilder(() {
    Get.lazyPut<CountController>(() => CountController());
  })),
]

binding 분리

앞에서와 같이 Get.to / Get.toNamed 또는 GetPage에서 binding을 직접 사용할 수 있지만, 다음과 같이 binding을 분리할 수 있습니다.

class SecondBinding implements Bindings {
  @override
  void dependencies() {
    Get.lazyPut<CountController>(() => CountController());
  }
}

이렇게 생성한 binding을 다음과 같이 Get.to / Get.toNamed에서 사용할 수 있습니다.

Get.to(Second(), binding: binding: SecondBinding());

또는 다음과 같이 GetPage에서도 사용할 수 있습니다.

getPages: [
  GetPage(name:"/", page: () => Home()),
  GetPage(name:"/second", page: () => Second(), binding: SecondBinding()),
]

permanent와 GetxService

GetX에서 컨트롤러는 사용이 종료되면 자동으로 메모리에서 제거됩니다. 하지만, 미리 데이터를 로드하거나 자주 사용되는 컨트롤러는 미리 메모리에 로드하고, 로드된 컨트롤러를 제거하지 않고 계속 사용할 경우가 있습니다. 이럴 때, 다음과 같이 permanent 옵션을 사용할 수 있습니다.

Get.put(CountController(), permanent: true);

또는 다음과 같이 GetxController를 사용하는 것이 아니라 GetxService를 사용하여 제거되지 않는 컨트롤러를 생성할 수 있습니다.

// class CountController extends GetxController {
class CountController extends GetxService {
  ...
}

Get.reset

이미 메모리에 추가된 컨트롤러를 초기화해야 할 경우, 다음과 같이 Get.reset을 사용할 수 있습니다.

Get.reset();

주로 다음과 같이 테스트 코드를 작성할 때 사용됩니다.

setUp(() {
  Get.reset();
});

Get.remove

거의 사용되지 않지만, 특정한 상황에서 메모리에 등록된 컨트롤러를 제거할 필요가 있을 때, Get.remove를 사용할 수 있습니다.

Get.delete<CountController>();

GetX는 컨트롤러의 사용이 종료되면, 자동으로 메모리에서 제거되므로 보통은 사용할 일이 없습니다.

완료

이것으로 GetX에서 종속성을 관리하는 방법에 대해서 알아보았습니다. 또한 GetX로 생성한 컨트롤러를 계속 유지하거나 다시 초기화를 하는 방법에 대해서도 알아보았습니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts