Flutter/Package

[Flutter] GetX ③ - 종속성 관리

찌김이 2022. 8. 30. 06:00
728x90
반응형
 

get | Flutter Package

Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX.

pub.dev

 

설정

pubspec.yaml

dependencies:
  get: ^4.6.5

 

main.dart

  • MaterialApp 을 GetMaterialApp 으로 변경해주세요.
import 'package:flutter/material.dart';
import 'package:get/get.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
  	
    // MaterialApp 을 GetMaterialApp 으로 변경
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const SampleScreen(),
    );
  }
}

 

 

 

종속성 관리

 

종속성 인스턴스

GetX 의 종속성 인스턴스는 다음과 같습니다.

  • Get.put
  • Get.lazyPut
  • Get.putAsync
  • Get.create

 

Get.put()

종속성을 주입하는 일반적인 방법 입니다.

class SampleScreen extends StatelessWidget {

  // Get.put(SomeClass());
  // Get.put(SampleController(), permanent: true);
  // Get.put(SampleController, tag: "some unique string");

  final controller = Get.put(SampleController());
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
    .
    .
    );
  }
}

 

Get.put<S>(

  // 종속성 주입할 class
  S dependency
  
  // 예를 들어 같은 동작을 하는 컨트롤러를 만들 때, 특정 컨트롤러를 찾을 때 사용
  String tag,
  
  // 사용이 종료되면 메모리 유지 여부
  // 자주 사용되거나 미리 메모리에 로드하고 사용할 경우 true
  bool permanent = false,
  
  // 테스트에서 추상 클래스를 사용한 후 다른 클래스로 교체하고 테스트를 따를지 여부
  bool overrideAbstract = false,
  
  // 함수를 사용하여 종속성을 만들 때 사용
  InstanceBuilderCallback<S> builder,
)

 

 

Get.lazyPut

인스턴스를 바로 만들지 않고 사용되는 시점에 생성됩니다.

class SampleScreen extends StatelessWidget {

  // final controller = Get.lazyPut(() {
  //   // dosomething
  //   return SampleController();
  // });

  final controller = Get.lazyPut(() => SampleController());
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
    .
    .
    );
  }
}

 

Get.lazyPut<S>(
  
  // 클래스가 호출될 때 실행되는 함수
  InstanceBuilderCallback builder,
  
  // 예를 들어 같은 동작을 하는 컨트롤러를 만들 때, 특정 컨트롤러를 찾을 때 사용
  String tag,

  // permanent 와 비슷하지만 다시 사용할 때 Get이 바인딩 api의 "SmartManagement.keepFactory"와 동일하게 인스턴스를 재생성 함 
  bool fenix = false
  
)

 

 

Get.putAsync

추가하려는 인스턴스가 Future 를 반환하는 경우 사용합니다.

Get.putAsync<SharedPreferences>(() async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setInt('counter', 12345);
  return prefs;
});

Get.putAsync<YourAsyncClass>( () async => await YourAsyncClass() )

 

Get.putAsync<S>(

  // 필수: 클래스를 인스턴스화 하기 위해 실행되는 비동기 메서드입니다.
  AsyncInstanceBuilderCallback<S> builder,

  // 예를 들어 같은 동작을 하는 컨트롤러를 만들 때, 특정 컨트롤러를 찾을 때 사용
  String tag,

  // 사용이 종료되면 메모리 유지 여부
  // 자주 사용되거나 미리 메모리에 로드하고 사용할 경우 true
  bool permanent = false
)

 

 

Get.create

put 처럼 인스턴스가 생성되는 것은 똑같지만 isSingleton 이 false 라서 계속 생성 가능합니다.

문서에서는 리스트뷰 안의 버튼을 예시로 들고 있습니다.

Get.create 는 GetWidget 과 함께 사용되어야 합니다. 

Get.Create<SomeClass>(() => SomeClass());
Get.Create<LoginController>(() => LoginController());

 

Get.create<S>(
  // 필수: `Get.find()`가 호출 될 때마다 만들어진 클래스를 반환하는 메서드입니다.
  // 예시: Get.create<YourClass>(() => YourClass())
  FcBuilderFunc<S> builder,
  
  // tag 와 동일합니다.
  // 예를 들어 같은 동작을 하는 컨트롤러를 만들 때, 특정 컨트롤러를 찾을 때 사용
  String name,

  // 사용이 종료되면 메모리 유지 여부
  // 자주 사용되거나 미리 메모리에 로드하고 사용할 경우 true
  // create 에서 permanent 기본값은 true 입니다.
  bool permanent = true
)

 

 

Get.find

메모리에 추가한 인스턴스는 Get.find를 통해 찾아서 사용할 수 있습니다.

class SampleScreen extends StatelessWidget {

  final controller = Get.find<SampleController>();
  // 또는 SampleController controller = Get.find();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
    .
    .
    .
    )
  }
}

 

 

Get.delete

단어 그대로 인스턴스를 제거할 때 사용됩니다.

Get.delete<SampleController>();

Get.delete<SampleController>(tag : 'TAG_NAME');

 

 

Get.reset

인스턴스를 초기화하는 것이며, 테스트에서 주로 사용됩니다.

Get.reset<SampleController>();

 

 

 

Bindings

bindings 는 주로 라우트와 같은 페이지 이동에 쓰입니다.

예를 들어 A 페이지에서 B 페이지로 이동 할 때 B 페이지에 필요한 인스턴스를 바인딩하여 전달하면 B 페이지 이동 후 바로 인스턴스가 선언되어 사용할 수 있고 페이지가 pop 되면 바인딩 된 인스턴스가 삭제 처리가 됩니다.

해당 페이지에서 사용되고 있는 인스턴스에 대한 관리에 대한 신경을 덜어주는 역할을 하는 것 같습니다.

 

 

sample_binding.dart

  • class 를 만들고 Bindings 를 상속 받고 implement method 인 dependencies 를 넣어줍니다.
  • dependencies 에 추가할 인스턴스를 넣어주세요.
import 'package:get/get.dart';
import 'package:getx_sample/sample_controller.dart';

class SampleBinding extends Bindings {

  @override
  void dependencies() {
    Get.put(SampleController());
  }
}

 

 

binding 의 사용방법은 다음과 같습니다.

 

  • GetMaterialApp 에서 GetPage 를 이용
GetMaterialApp(
   .
   .
   .
   getPages: [
     GetPage(
       name: '/',
       page: () => SampleScreen(),
       binding: SampleBinding(),
     ),
   ],
   initialRoute: '/',
);

 

  • Get.to 를 이용한 방법
Get.to(
  SampleScreen(),
  binding: SampleBinding(),
);

 

  • BindingsBuilder 를 이용한 방법
GetMaterialApp(
   .
   .
   .
   getPages: [
     GetPage(
       name: '/',
       page: () => SampleScreen(),
       binding: BindingsBuilder(() {
          Get.put(SampleController());
       }),
     ),
   ],
   initialRoute: '/',
);


Get.to(
  SecondPage(),
  binding: BindingsBuilder(() {
    Get.put(SampleController());
  }),
);

 

 

 

 

GitHub - jonataslaw/getx: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies eas

Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with Get. - GitHub - jonataslaw/getx: Open screens/snackbars/dialogs/bottomSheets without c...

github.com

 

728x90
반응형

'Flutter > Package' 카테고리의 다른 글

[Flutter] GetX ⑤ - Utils (Dialog, SnackBar)  (0) 2022.09.01
[Flutter] GetX ④ - Route Management  (0) 2022.08.31
[Flutter] GetX ② - 상태 관리  (0) 2022.08.29
[Flutter] GetX ① - 소개  (0) 2022.08.28
[Flutter] image_picker  (1) 2022.08.13