일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 직정인자기계발
- 패스트캠퍼스후기
- 수강료0원챌린지
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 패캠챌린지
- 코딩자격증
- 패스트캠퍼스
- 파이썬
- 코딩교육
- 패캠인강후기
- 직장인인강
- 코딩테스트
- 패캠강의후기
- 환급챌린지
- 자바
- 패캠reactnative
- fastcampus
- 직장인공부
- 자바스크립트
- 오공완
- reactnative강의
- 직장인자기계발
- 패캠
- Today
- Total
라티의 작은 일기장
패스트캠퍼스 환급챌린지 17일차 미션(2월 17일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기 본문
패스트캠퍼스 환급챌린지 17일차 미션(2월 17일): 15개 프로젝트로 실무까지 끝내는 Dart & Flutter 앱 개발 강의 후기
코드라티 2024. 2. 17. 23:57Flutter 앱도 생명주기가 있다. 크게 화면에 노출 / 유저 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에서는 이렇게 디바이스의 여러 상태를 조절할 수 있는데, 아래처럼 기기에서 수신 중인 네트워크의 종류와 신호 세기를 지정하거나, 배터리 잔량을 조절하거나 할 수 있다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.