flutter

WidgetsBindingObserver

paulaner80 2020. 12. 8. 06:30
반응형

* WidgetsBinding : 생명주기 이벤트 제공

* WidgetsBindingObserver : 생명 주기 이벤트 수신


플러터는 생명주기 이벤트들을 제공하는데, WidgetsBindingObserver를 State에 mixin함으로서 이것을 사용할 수 있습니다.



class _MyWidgetState extends State<MyWidget> with WidgetsBindingObserver {

  @override

  Widget build(BuildContext context) {

    ...

  }

}





WidgetsBinding  인스턴스는 앱 수명주기 이벤트를 제공합니다.

클래스에 WidgetsBindingObserver를 mixin으로 추가하면, 

initStat에서 WidgetsBinding에 옵저버로 추가 할 수 있고,

dispose에서 옵저버에서 제거할 수 있습니다.


@override

void initState() {

  WidgetsBinding.instance.addObserver(this);

  super.initState();

}

@override

void dispose() {

  WidgetsBinding.instance.removeObserver(this);

  super.initState();

}




이렇게 하면 didChangeAppLifecycleState() 메소드를 통해 생명주기 변경이벤트를 수신할 수있습니다.

@override

void didChangeAppLifecycleState(AppLifecycleState state) {

  super.didChangeAppLifecycleState(state);

}



AppLifecycleState는 enum입니다. resumed, inactive, paused, detached 값을 갖습니다.


이 문서에서는 앱이 paused가 되었는지를 추적해야합으로 paused 이벤트가 중요합니다.

이를 위해 _isPaused 프러퍼티를 추가합니다. 그렇지 않으면 lockscreen이 여러개 생성될 수 있습니다.



bool _isPaused = false;

@override

void didChangeAppLifecycleState(AppLifecycleState state) {

  if (state == AppLifecycleState.paused && !_isPaused) {

    _isPaused = true;

    _showLockScreen(); // this should use the `Navigator` to push a new route

  }

  super.didChangeAppLifecycleState(state);

}


_showLockScreen() 메서드는 Navigator를 사용하여 라우트를 푸쉬합니다.

잠금화면 구현은 WillPopScopre 위젯으로 감샀습니다.

왜냐하면 안드로이드백버튼 이나 ios 스위프 제스쳐를 사용해서 잠금화면이 사라지는 것을 막기위해서입니다.

아래는 간단한 예제입니다.


void _showLockScreen() async {

  await Navigator.of(context).push(MaterialPageRoute(builder: (context) =>

    WillPopScope(

      child: ...,

      onWillPop: () => Future.value(false), // prevents the system from dismissing this route

    )));

  

  _isPaused = false;

}



잠금화면 위젯은 로그인이 성공하거나하면 

Navigator.of(context).pop();

을 통하여 dismiss 할 수 있습니다.


이 정도면 잠금화면을 표시할 수 있습니다.





잠금 화면은 사용자가 잠금 화면을 해제하는 것을 방지하기 위해 WillPopScope 위젯에 래핑 된 위젯입니다.


'flutter' 카테고리의 다른 글

flutter - firebase 로그인, 로그아웃  (0) 2020.12.21
isolate를 이용하여 데이터 처리하기  (0) 2020.12.18
Form, TextFormField  (0) 2020.12.04
데스트탑 플러터  (0) 2020.11.11
권한가져오기(checkPermissionStatus)  (0) 2019.11.13