패스트캠퍼스 환급챌린지 17일차 미션(2월 17일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기
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에서는 이렇게 디바이스의 여러 상태를 조절할 수 있는데, 아래처럼 기기에서 수신 중인 네트워크의 종류와 신호 세기를 지정하거나, 배터리 잔량을 조절하거나 할 수 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.