라티의 작은 일기장

패스트캠퍼스 환급챌린지 17일차 미션(2월 17일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기 본문

Flutter & Dart

패스트캠퍼스 환급챌린지 17일차 미션(2월 17일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기

코드라티 2024. 2. 17. 23:57

Flutter 앱도 생명주기가 있다. 크게 화면에 노출 / 유저 Input 가능 / OS View에 붙어있는가? 3가지 기준으로 4개의 생명주기를 갖는다고 할 수 있다.

- inactive: 화면에 노출 O / 유저 Input 가능? X / OS View에 붙어있는가? O

- paused: 화면에 노출 X / 유저 Input 가능? X / OS View에 붙어있는가? O

- resumed: 화면에 노출 O / 유저 Input 가능? O / OS View에 붙어있는가? O

- detatched: 화면에 노출 X / 유저 Input 가능? X / OS View에 붙어있는가? X

보통 일반적으로 유저가 앱을 사용할 때는 resumed, 앱을 종료할 때는 detatched 상태가 된다.

문자를 받거나 해서 앱의 화면은 노출되지만 input이 이루어질 수 없는 상황이 inactive, 홈 화면으로 나가서 앱이 백그라운드에서 돌고 있게 되면 paused 상태로 돌입하게 된다.

 

어제 실습해본 흔들기 카운트앱은 paused 상태에서도 이 흔들기를 감지해서 카운트가 올라가는 에러가 있었다.

이제 이 생명주기에 적절하게 흔들기 리스너를 활성화 / 비활성화해서 문제를 해결해보자.

 

생명주기를 앱에서 관찰하기 위해서는 WidgetsBinding이라는 클래스가 필요하다.

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  int _counter = 0;

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    ShakeDetector detector = ShakeDetector.autoStart(onPhoneShake: () {
      _incrementCounter();
    },
      shakeThresholdGravity: 1.2
    );
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

 

WidgetsBinding의 인스턴스 메서드인 addObserver에 this, 즉 자기 자신을 넘겨주면 되는데, 이 addObserver의 인자로 넘길 수 있는것은 WidgetsBindingObserver이므로, State 클래스를 WidgetsBindingObserver 객체로 변환하여 넘겨주는 것이다.

 

그리고 didChangeAppLifecycleState 함수를 override해서 각 상태마다 취할 Actiond을 정의해주면 된다.

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed :
        detector.startListening();
      case AppLifecycleState.inactive:
      case AppLifecycleState.paused:
        detector.stopListening();
      case AppLifecycleState.detached:
      case AppLifecycleState.hidden:
    }
  }

 

switch문에서 이 상태에 대한 case 처리를 할 때, 강의에서는 나오지 않았던 hidden이라는 상태에 대해서도 case 처리를 해줘야했는데, 찾아보니 새롭게 추가된 상태라고 한다.(공식문서: https://api.flutter.dev/flutter/dart-ui/AppLifecycleState.html#hidden)

paused -> inactive 상태로 전이하거나 inactive -> paused 상태로 전이할 때 이 hidden 상태를 거쳐간다고 한다.

 

일단 저렇게 resumed 상태에서 흔들기를 감지하고, paused 상태에서는 흔들기를 감지하지 않도록 바꿔주었다.

테스트 해봤는데 잘 된다.

 

우리가 흔들기를 테스트해봤던 것처럼 AVD에서는 이렇게 디바이스의 여러 상태를 조절할 수 있는데, 아래처럼 기기에서 수신 중인 네트워크의 종류와 신호 세기를 지정하거나, 배터리 잔량을 조절하거나 할 수 있다.

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://bit.ly/48sS29N