Flutter 에서 생명주기를 다뤄보자

조수민·2023년 3월 25일
0


토이 프로젝트인 간호사 캘린더를 만들고 있는데, SharedPreference 를 이용해 기기 내에서 그 달의 계획을 저장해두려고 한다.

원래는 그 날의 일정을 정할 때 (아래 4개 중 한 버튼을 눌러 일정을 정하거나 취소할 때 ) 마다 SharedPreference 에 정보를 갱신해주려고 했는데, 너무 비효율적이라는 생각이 들었다.

앱을 종료할 때 정보를 저장하면 훨씬 효율적이라는 생각이 들었고, flutter 의 생명 주기를 찾아보았다.

Flutter는 Android와는 다르게 생명주기(Lifecycle) 개념을 직접 구현하지 않는다.

Flutter에서는 Android의 생명주기(Lifecycle) 개념과는 다르게, 앱의 상태 변화를 AppLifecycleState 라는 열거형 상수를 통해 확인할 수 있다. 이는 앱의 생명주기와 유사한 개념이지만, 엄밀히 말하면 생명주기(Lifecycle)는 Android와 같은 플랫폼에서만 존재하는 개념이라고 한다..

따라서, Flutter에서는 생명주기 메소드(onCreate, onStart, onResume 등)를 직접적으로 구현하지 않는다. 대신, AppLifecycleState 열거형 상수를 사용하여 앱의 상태 변화를 추적하고, didChangeAppLifecycleState 메소드를 오버라이드하여 상태 변화에 따라 필요한 작업을 수행한다.

Flutter에서는 다음과 같은 네 가지의 AppLifecycleState가 제공된다.

  1. AppLifecycleState.inactive: 앱이 활성화되지 않은 상태이다. 예를 들어, 다른 앱이나 시스템 대화 상자와 같은 것이 표시되었을 겨우.
  2. AppLifecycleState.paused: 앱이 일시 중지된 상태이다. 예를 들어, 앱이 백그라운드로 이동했을 경우.
  3. AppLifecycleState.resumed: 앱이 활성화된 상태이다. 예를 들어, 사용자가 앱으로 돌아왔을 경우.
  4. AppLifecycleState.detached: 앱이 분리된 상태이다. 예를 들어, 앱이 분할 화면 모드에서 다른 앱과 함께 실행 중인 경우.

내 개발 요구사항을 생각해 봤을 때 활용할 수 있는 메소드는 2번이다.

import 'package:flutter/material.dart';

class MyWidgetsBindingObserver extends WidgetsBindingObserver {
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      Get.find<InitEventStart>().setPreference();
    }
  }
}

void main() {
  runApp(MyApp());
  WidgetsBinding.instance.addObserver(MyWidgetsBindingObserver());
}


위 코드에서 MyWidgetsBindingObserver 클래스는 WidgetsBindingObserver를 상속받아 didChangeAppLifecycleState 메서드를 오버라이드한다. 이 메서드에서 AppLifecycleState가 paused 상태로 변경되는 시점에서 실행할 코드를 작성할 수 있다.

하지만, "모두 닫기" 버튼을 누를 때는 어떤 메서드도 호출되지 않기 때문에, 이 경우에도 위의 예제처럼 WidgetsBindingObserver를 사용하여 앱 종료 직전에 실행할 작업을 구현할 수 없다.

그래도 "모두 닫기" 버튼을 누르기 전, 앱을 나가야 하므로 반드시 AppLifecycleState.paused 상태가 될 것이라, 이걸 사용해도 문제없다는 생각이 들었다.

profile
처음 개발하는 사람들이 봐도 이해될 수 있게

0개의 댓글