본문 바로가기
Flutter

flutter에서 go_router로 로그인시 라우팅 설정하기. 로그아웃일 때 못들어가게 하기.

by 난타코다옹 2024. 3. 1.

목차

    안녕하세요, 오늘은 Flutter에서 Go_router를 이용하여 로그인 시 라우팅 설정하고 로그아웃 시 접근을 제한하는 방법에 대해 알아볼게요. Go_router는 Flutter에서 라우팅을 쉽게 관리할 수 있도록 도와주는 패키지에요.

    Flutter GoRouter에서 로그인 여부에 따라 라우팅 설정하기

    로그아웃 시 접근 제한
    로그아웃 상태일 때는 로그인이 필요한 페이지에 접근할 수 없도록 설정해야해요. 이를 위해 Go_router의 redirect 옵션을 사용하여 로그인 상태를 체크하고, 로그아웃 상태일 때는 로그인 페이지로 리다이렉트하도록 설정해요.

     

     

    핵심은 router 안에서 redirect로 로그인 상태가 아니면 로그인 페이지로 보내주는 것이에요!!

     

     

    1. pubspec.yaml:

    패키지 다운로드 합니다. flutter pub get 해주시고

    dependencies:
      go_router: ^13.2.0

     

    2. main.dart:

    router는 router.dart로 따로 빼셔도 됩니다.

    MaterialApp.router(
    routerConfig: isLoggedIn
    ? ref.watch(routerProvider)
    : ref.watch(logOutRouterProvider),
     

    제 앱에 로그인 분기하는 부분인데요 저는 로그아웃 시에 갈 페이지가 많아 GoRouter를 2개 만들어서 로그인시, 로그아웃시 각각 만들고 상태를 riverpod로 나눠지게 만들었어요. 다음에는 이 방법도 자세히 알려드릴게요.

    import 'package:flutter/material.dart';
    import 'package:go_router/go_router.dart';
    import 'login_state.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      MyApp({Key? key}) : super(key: key);
    
      final _router = GoRouter(
        initialLocation: '/login',
        redirect: (state) {
          final isLoggedIn = LoginState().isLoggedIn;
          if (!isLoggedIn && state.location != '/login') {
            return '/login';
          }
          return null;
        },
        routes: [
          GoRoute(
            path: '/login',
            builder: (context, state) => LoginPage(),
          ),
          GoRoute(
            path: '/home',
            builder: (context, state) => HomePage(),
          ),
        ],
      );
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp.router(
          routeInformationParser: _router.routeInformationParser,
          routerDelegate: _router.routerDelegate,
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
        );
      }
    }

     

    3. login_state.dart:

    저는 구글 로그인과 애플로그인을 지원하고 있는데 일단 간단하게 로그인 상태 getter만 만들어서 라우터에 쓰면 됩니다.

    class LoginState {
      bool get isLoggedIn => _isLoggedIn;
    
      void login() {
        _isLoggedIn = true;
      }
    
      void logout() {
        _isLoggedIn = false;
      }
    
      bool _isLoggedIn = false;
    }

     

     

    4. LoginPage.dart:

    로그인 페이지

    class LoginPage extends StatefulWidget {
      const LoginPage({Key? key}) : super(key: key);
    
      @override
      _LoginPageState createState() => _LoginPageState();
    }
    
    class _LoginPageState extends State<LoginPage> {
      final _loginState = LoginState();
    
      void _login() {
        _loginState.login();
        context.go('/home'); // 로그인 후 원래 이동하려던 페이지로 이동
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Login'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: _login,
                  child: Text('Login'),
                ),
              ],
            ),
          ),
        );
      }
    }

     

    5. HomePage.dart:

    로그인 이후 홈페이지 들어올 수 있어요

    class HomePage extends StatelessWidget {
      const HomePage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home'),
          ),
          body: Center(
            child: Text('Welcome to Home Page!'),
          ),
        );
      }
    }

    설명:

    • go_router 패키지의 redirect 속성을 사용하여 로그인 여부에 따라 라우팅을 설정합니다.
    • LoginState 클래스를 만들고 isLoggedIn getter를 사용하여 로그인 여부를 확인합니다.
    • onRedirect 함수를 사용하여 로그인하지 않은 사용자를 로그인 페이지로 리디렉션합니다.
    • 로그인 후 원래 이동하려던 페이지로 이동하도록 goRouter.go()를 사용합니다.

    참고:

    오늘은 Flutter에서 Go_router를 이용하여 로그인 시 라우팅 설정하고 로그아웃 시 접근을 제한하는 방법에 대해 알아봤어요. 이제 여러분도 Go_router를 사용하여 라우팅을 쉽게 관리할 수 있어요. 다음에 또 만나요!