* 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 |