본문 바로가기

# 02/Flutter

[Flutter] GetX middleware

반응형

Setting Router Guards

 

프로필 페이지를 이동하기 전에 로그인이 안되어 있는 경우 로그인 먼저 하고 오라고 리디렉션 해준다고 생각하면 쉬움.

 

class AuthGuard extends GetMiddleware {

  @override
  RouteSettings? redirect(String? route) {
    if (!AuthService.to.isLoggedInValue) return const RouteSettings(name: Routes.login);
    return null;
  }
}

 

AuthService는 로그인 체크하는 서비스임!

AuthService 에서 로그인정보 확인 하여 로그인 안되있는 경우 로그인 페이지로 리디렉션!

 

 @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      enableLog: true,
      initialRoute: AppPages.initial,
      getPages: AppPages.routes,
      initialBinding: BindingsBuilder(
        () {
          Get.put(SplashService());
          Get.put(AuthService());
        },
      ),
    );
  }

 

맨 처음에 AuthService 실행해주고!

 

class AuthService extends GetxService {
  static AuthService get to => Get.find();

  /// Mocks a login process
  final isLoggedIn = false.obs;
  bool get isLoggedInValue => isLoggedIn.value;

  void login() {
    isLoggedIn.value = true;
  }

  void logout() {
    isLoggedIn.value = false;
  }
}

 

이런식 으로 로그인 관리 가능!

 

    GetPage(
      middlewares: [
        AuthGuard(),
      ],
      name: Routes.profile,
      page: () => const ProfileView(),
      bindings: [
        ProfileBinding(),
      ],
    ),

 

이렇게 app_pages 에 middlewares 에 추가 해주면 

 

Get.toNamed(Routes.profile);

 

페이지 이동 할 때 로그인 여부 검사해서 로그인 안 되있을 경우 로그인 페이지로 이동!

 

class AuthGuard extends GetMiddleware {

  @override
  GetPage? onPageCalled(GetPage? page) {
    Log.i('---------------onPageCalled');
    return super.onPageCalled(page);
  }

  @override
  List<Bindings>? onBindingsStart(List<Bindings>? bindings) {
    Log.i('---------------onPageCalled');
    return super.onBindingsStart(bindings);
  }

  @override
  GetPageBuilder? onPageBuildStart(GetPageBuilder? page) {
    Log.i('---------------onPageBuildStart');
    return super.onPageBuildStart(page);
  }

  @override
  void onPageDispose() {
    Log.i('---------------onPageDispose');
    super.onPageDispose();
  }

  @override
  RouteSettings? redirect(String? route) {
    if (!AuthService.to.isLoggedInValue) return const RouteSettings(name: Routes.login);
    return null;
  }
}

 

그 밖에 여러 기능들도 있다!

 

Redirect

라우트 호출을 할 때 바인딩과 종속성이 주입되기 전에 이 함수가 먼저 호출된다. 인증 및 권한 부여 호출을 하기에 가장 좋은 곳이다.

경로 이름을 사용하는 RouteSettings 를 반환한다. 이름을 사용하여 클라이언트를 리디렉션할 위치를 지정할 수 있다.

 

OnPageCalled

이 함수는 위젯이 빌드되기 전에 호출된다. 이 기능을 사용하면 필요한 데이터를 전달할 수 있다. 예를 들어 사용자 이름을 AppBar에 제목으로 추가하고 싶을 것이다.

 

OnBindingsStart. All pages that need a controller or a service would need dependencies will need to be added using bindings. Any validations can be done from within this function.

컨트롤러 또는 서비스가 필요한 모든 페이지는 종속성을 필요로 하며 바인딩을 사용하여 추가해야 한다. 이 함수 내에서 모든 유효성 검사를 수행할 수 있다.

 

OnPageBuildStart. This function is called right after the bindings initialize and before the page is built.

이 함수는 바인딩 초기화된 직후와 페이지가 빌드되기 직전에 호출된다.

 

OnPageDispose. Called right after disposing any controllers.

페이지 삭제. 컨트롤러 삭제한 직후에 호출된다.

 

 

반응형