Flutter/Package

[Flutter] GetX ② - 상태 관리

찌김이 2022. 8. 29. 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 으로 변경해주세요.
  • GetX 를 상태관리로만 사용하실거면 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 의 상태 관리 방법은 두가지 입니다.

  • 단순 상태 관리자 - GetBuilder
  • 반응 상태 관리자 - GetX/Obx

 

GetX 상태 관리의 특징은

  • 상태 관리를 위해 필요한 것은 controller class 이며 controller class 는 상태 관리 방법에 따라 조금 다릅니다. 
  • GetX 로 상태 관리를 한다면 StatefulWidget 을 쓰지 않아도 됩니다.

 

예시는 카운팅 앱으로 진행하겠습니다.

 

 

 

단순 상태 관리자 - GetBuilder

 

sample_controller.dart

  • class 를 만들어 주고 GetxController 를 상속 받습니다.
  • 숫자를 저장할 변수를 선언해주고 증감처리를 하는 함수를 만듭니다.
  • 함수 호출하면 증감 처리 후 update() 를 호출하면 상태가 변경 됩니다.

 

import 'package:get/get.dart';

class SampleController extends GetxController {

  int _counter = 0;
  int get counter => _counter;

  void increment() {
    _counter++;
    update();
  }

  void decrement() {
    _counter--;
    update();
  }
}

 

sample_screen.dart

  • 상태 관리가 필요한 위젯을 GetBuilder 로 구현합니다.
  • Get.put 을 통해서 controller 를 주입하는 방법도 있지만 GetBuilder 의 init 속성으로도 주입 가능합니다.
  • Text 위젯에는 카운트 변수, 증감 버튼에는 증감 함수를 넣어주면 구현이 완료됩니다.
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:getx_sample/sample_controller.dart';

class SampleScreen extends StatelessWidget {
  const SampleScreen({Key? key}) : super(key: key);
  
  // final controller = Get.put(SampleController());
  
  @override
  Widget build(BuildContext context) {
    return GetBuilder<SampleController>(
      init: SampleController(),
      builder: (SampleController controller) {
        return Scaffold(
          appBar: AppBar(),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                '${controller.counter}',
                style: const TextStyle(fontSize: 40),
              ),
              const SizedBox(height: 40),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  ElevatedButton(
                    onPressed: controller.increment,
                    child: const Icon(Icons.add),
                  ),
                  const SizedBox(width: 40),
                  ElevatedButton(
                    onPressed: controller.decrement,
                    child: const Icon(Icons.remove),
                  ),
                ],
              )
            ],
          ),
        );
      },
    );
  }
}

 

 

 

반응 상태 관리자 - GetX/Obx

 

sample_controller.dart

  • class 를 만들어 주고 GetxController 를 상속 받습니다.
  • 숫자를 저장할 변수를 Rx로 선언 (ex - int => RxInt) 해주고 증감처리를 하는 함수를 만듭니다.
  • Rx 변수는 뒤에 obs 만 붙여주면 됩니다.
  • 함수를 호출하면 증감 처리 후 별도의 처리 없이 상태가 변경 됩니다.
import 'package:get/get.dart';

class SampleController extends GetxController {

  RxInt _counter = 0.obs;
  RxInt get counter => _counter;

  void increment() {
    _counter++;
  }

  void decrement() {
    _counter--;
  }
}

 

 

sample_screen.dart

  • Get.put 을 통해서 controller 를 주입해줍니다.
  • 부모 위젯에서 controller 를 Get.put 을 해준적이 있다면 Get.find 로 controller 를 불러올 수 있습니다.
  • 상태에 따라 변경될 Text 위젯에는 Obx 로 감싸주시고 controller 의 counter 변수를 넣어주면 됩니다.
  • 증감함수 사용은 단순 상태 관리자와 동일합니다.
class SampleScreen extends StatelessWidget {

  final controller = Get.put(SampleController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
        // 반응 상태 관리
          Obx(() => Text(
              '${controller.counter}',
              style: const TextStyle(fontSize: 40),
            ),
          ),
          const SizedBox(height: 40),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: controller.increment,
                child: const Icon(Icons.add),
              ),
              const SizedBox(width: 40),
              ElevatedButton(
                onPressed: controller.decrement,
                child: const Icon(Icons.remove),
              ),
            ],
          )
        ],
      ),
    );
  }
}

 

 

GetxController 의 LifeCycle 과 Woker 이벤트

GetxController 의 LifeCycle 은 다음과 같습니다.

  • onInit -  GetxController 가 생성될 때 호출
  • onReady - GetxController 가 initialized 된 후 호출
  • onClose -  GetxController 가 메모리에서 제거될 때 호출

 

반응형 상태 값은 변화를 감지하는 콜백함수를 제공합니다.

  • ever - 반응형 상태 값이 변경될 때 마다 호출
  • once - 반응형 상태 값이 처음 변경될 때 호출
  • debounce - 반응형 상태 값의 마지막 변경 이후 특정 시간동안 변경이 없으면 호출
  • interval - 반응형 상태 값이 변경되는 동안, 일정 간격으로 호출

 

sample_controller.dart

import 'package:get/get.dart';

class SampleController extends GetxController {

  RxInt _counter = 0.obs;
  RxInt get counter => _counter;

  @override
  void onInit() {
    super.onInit();
    
    // ever
    ever(counter, (int count) => print("counter 값이 $count 로 변경 되었습니다."));

    // once
    once(counter, (int count) => print("counter 값이 $count 로 처음 변경 되었습니다."));
    
    // debounce
    debounce(counter, (int count) => print("$count 로 변경 후 1초 지났습니다."), time: const Duration(seconds: 1));
    
    // interval
    interval(counter, (int count) => print("값이 변경되는 동안 1초 간격으로 호출합니다. 현재 $count"), time: const Duration(seconds: 1));
  }
  
  @override
  void onClose() {
    super.onClose();
    print('onClose');
  }

  @override
  void onReady() {
    super.onReady();
    print('onReady');
  }

  void increment() {
    _counter++;
  }

  void decrement() {
    _counter--;
  }
}

 

 

 

728x90
반응형

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

[Flutter] GetX ④ - Route Management  (0) 2022.08.31
[Flutter] GetX ③ - 종속성 관리  (0) 2022.08.30
[Flutter] GetX ① - 소개  (0) 2022.08.28
[Flutter] image_picker  (1) 2022.08.13
[Flutter] photo_manager  (0) 2022.08.11