[Flutter] GetX SnackBar 가 있을 때 Swipe Gesture 로 종료시 Freeze 해결 방법

locked·2021년 5월 21일
0

이번 포스트는 GetX에서의 이슈: 773에 대해 다뤄보려고 한다.

해당 이슈는 iOS에서 특정 상황에 제스쳐를 통해 페이지를 종료하는 경우에만 발생하는 에러이다.

특정 상황은 다음과 같다.

  • GetX에서 생성한 SnackBar가 화면에 존재할 때

해결하는 방법은 이슈에도 적어뒀듯이 다음과 같다.

First Step

  • 스낵바에서 snackbarStatus의 사용
Get.snackbar(
  title,
  content,
  snackbarStatus: (_) {
    if (_ == SnackbarStatus.CLOSED || _ == SnackbarStatus.CLOSING) {
      WidgetsBinding.instance.addPostFrameCallback((_) {
        final dismissController = Get.find<DismissNavigationController>();
        if (dismissController.isDismiss) Get.back();
        dismissController.setDone();
      });
    }
  },

Second Step

  • 페이지 종료 상태를 관리할 DismissNavigationController 생성
  • 혹은, 전역 변수 사용
class DismissNavigationController extends GetxController {
  bool _dismiss = false;
  bool get isDismiss => _dismiss;
  setDismiss() => _dismiss = true;
  setDone() => _dismiss = false;
}

Third Step

  • 사용자의 제스쳐를 감지할 NavigatorObserver 생성
class DismissNavigationObserver extends NavigatorObserver {
  
  void didStartUserGesture(Route route, Route previousRoute) {
    Get.find<DismissNavigationController>().setDismiss();
    super.didStartUserGesture(route, previousRoute);
  }
  
  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
    print('[did Push] ${Get.isSnackbarOpen}');
    Get.find<DismissNavigationController>().setDone();
  }
}
  • Add Observer
GetMaterialApp(
  navigatorObservers: [
    DismissNavigationObserver(),
  ],
  ....
profile
Flutter 개발자

0개의 댓글