본문 바로가기

Flutter의 Widget에서 앱 활성화 여부 파악하기

기술적인 이야기/기타 개발 2020. 11. 13.
반응형

앱이 활성화될 때, 즉 백그라운드 상태에서 포그라운드 상태로 앱이 다시 올라왔을 때 위젯이 이 상태를 직접 파악하는 방법은 기존적으로 제공되지 않습니다. 앱 단위에선 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를 구현하는 예제이기 때문에 initStatedispose를 통해 위젯이 생성되거나 사라지는 시점을 알 수 있으니 이를 이용해 Observer를 등록하거나 제거할 수 있습니다.

그리고 Observer를 통해 앱의 상태가 변화되면 didChangeAppLifecycleState가 호출됩니다. 제 경우 여기서 resumed 상태를 파악해서 원하는 작업을 수행하여 문제를 해결할 수 있었습니다.

다만 약간의 문제가 있을 수도 있는데, 위젯이 삽입된 위치나 여러 사유로 인해 didChangeAppLifecycleState가 여러번 호출될 수도 있습니다. 이 부분만 잘 보완하면 문제는 없을 것 같습니다.

728x90
반응형

댓글