반응형
앱이 활성화될 때, 즉 백그라운드 상태에서 포그라운드 상태로 앱이 다시 올라왔을 때 위젯이 이 상태를 직접 파악하는 방법은 기존적으로 제공되지 않습니다. 앱 단위에선 onResume
이나 onPause
가 제공되는 것과는 다르게 말이죠. 제 경우 iOS 앱에서 백그라운드 태스크 앱이 백그라운드 상태에서 동작하다 포그라운드로 활성화될 때 UI 갱신이 누락되는 현상이 있어서 앱 활성화 여부를 알아낼 수 있어야 했습니다.
이와 관련해 정보를 찾아보던 도중 다행히도 제가 원하는 기능을 제공하는 Widget Bindings Observer라는 것을 발견할 수 있었습니다.
아래 예제는 특정 StatefulWidget
에서 WidgetBindingsObserver
를 사용해 앱의 상태 변화를 추적하는 코드를 구현한 예제입니다.
class SomeWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => _SomeWidgetState();
}
class _SomeWidgetState extends State<RLSlidableCards>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
doWhatWhenAppResumed();
} else if (state == AppLifecycleState.inactive) {
doWhatWhenAppInactive();
} else if (state == AppLifecycleState.paused) {
doWhatWhenAppPaused();
} else if (state == AppLifecycleState.suspending) {
doWhatWhenAppSuspending();
}
}
@override
Widget build(BuildContext context) {
...
}
}
State
를 구현하는 예제이기 때문에 initState
와 dispose
를 통해 위젯이 생성되거나 사라지는 시점을 알 수 있으니 이를 이용해 Observer를 등록하거나 제거할 수 있습니다.
그리고 Observer를 통해 앱의 상태가 변화되면 didChangeAppLifecycleState
가 호출됩니다. 제 경우 여기서 resumed
상태를 파악해서 원하는 작업을 수행하여 문제를 해결할 수 있었습니다.
다만 약간의 문제가 있을 수도 있는데, 위젯이 삽입된 위치나 여러 사유로 인해 didChangeAppLifecycleState
가 여러번 호출될 수도 있습니다. 이 부분만 잘 보완하면 문제는 없을 것 같습니다.
728x90
반응형
'기술적인 이야기 > 기타 개발' 카테고리의 다른 글
Flutter 앱 빌드 시 libarclite_iphoneos.a 및 아카이브 실패 문제 (0) | 2023.04.23 |
---|---|
Flutter에서 Debug 혹은 Release 모드 판단하기 (275) | 2022.04.24 |
Rust의 Generics 맛보기 (255) | 2020.11.01 |
Rust로 객체지향 프로그래밍 흉내내기 (1017) | 2020.10.26 |
Flutter에서 애플 앱스토어 업로드 시 최소 버전 표기 문제 (748) | 2020.10.13 |
댓글