PromleeBlog
sitemap
aboutMe

posting thumbnail
로그인 페이지 분기(FlutterSecureStorage)
Log in page branch (FlutterSecureStorage)

📅

🚀

들어가기 전에 🔗

목표, 조건 설정 및 초기설정, 개요 링크
이 포스팅은 Flutter 3.24 버전 기준으로 작성되었습니다.
기본 개발 환경 세팅이 완료되었다면, 이제 로그인 페이지를 만들어 보겠습니다. 로그인 페이지는 앱의 핵심이자, 사용자가 앱을 사용하기 위한 첫 번째 단계입니다.
로그인 페이지를 만들기 위해
FlutterSecureStorage
Get
패키지를 사용하여 로그인 정보를 저장하고, 로그인 페이지를 분기하는 방법을 알아보겠습니다.
이번 포스팅에서 필자의 lib 폴더 내부 file tree 구조입니다. 미리 생성해두고 시작하시면 편리합니다.
📦 lib
┣ 📂 model				// 데이터 보관하는 모델 폴더(이번 포스팅에서는 사용하지 않음)
┣ 📂 view				// 화면을 구성하는 뷰 폴더
┃ ┣ 📜 login_page.dart
┃ ┗ 📜 main_page.dart
┣ 📂 viewModel			// 데이터와 화면을 잇는 viewModel 폴더
┃ ┗ 📜 auth_service.dart
┗ 📜 main.dart

🚀

1. AuthService 클래스 생성 🔗

로그인 관련 처리를 하는 AuthService 클래스를 생성합니다.
로그인, 로그아웃, 로그인 상태 확인을 위한 메서드를 구현합니다.
FlutterSecureStorage 패키지를 사용하여 로그인 상태를 저장하고, 확인합니다.
lib/viewModel/auth_service.dart
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
 
class AuthService {
  // FlutterSecureStorage 인스턴스 생성 (보안 데이터 저장용)
  final _storage = const FlutterSecureStorage();
 
  // 로그인 상태 저장 (isLoggedIn = true 또는 false)
  Future<void> saveLoginState(bool isLoggedIn) async {
    await _storage.write(key: 'isLoggedIn', value: isLoggedIn.toString());
  }
 
  // 로그인 상태 불러오기 (저장된 값이 'true'인지 확인)
  Future<bool> getLoginState() async {
    final value = await _storage.read(key: 'isLoggedIn');
    return value == 'true';
  }
 
  // 로그아웃 처리 (저장된 로그인 상태 삭제)
  Future<void> logout() async {
    await _storage.delete(key: 'isLoggedIn');
  }
}

🚀

2. LoginPage 클래스 생성 🔗

로그인 페이지를 구성하는 LoginPage 클래스를 생성합니다.
로그인 버튼을 누르면 AuthService 클래스의 saveLoginState 메서드를 호출하여 로그인 상태를 저장합니다.
lib/view/login_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
 
import 'package:navigationbar_example/viewModel/auth_service.dart';
import 'package:navigationbar_example/view/main_page.dart';
 
class LoginPage extends StatelessWidget {
  final AuthService _authService = AuthService(); // AuthService 인스턴스 생성
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Login')), // 로그인 화면 제목
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 로그인 성공 시 상태를 저장 (true로 설정)
            await _authService.saveLoginState(true);
            // 로그인 후 메인 페이지로 이동
            Get.offAll(() => MainPage());
          },
          child: const Text('Login'), // 로그인 버튼 텍스트
        ),
      ),
    );
  }
}

🚀

3. MainPage 클래스 생성 🔗

메인 페이지를 구성하는 MainPage 클래스를 생성합니다.
로그아웃 버튼을 누르면 AuthService 클래스의 logout 메서드를 호출하여 로그인 상태를 삭제합니다.
lib/view/main_page.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
 
import 'package:navigationbar_example/view/login_page.dart';
import 'package:navigationbar_example/viewModel/auth_service.dart';
 
class MainPage extends StatelessWidget {
  final AuthService _authService = AuthService(); // AuthService 인스턴스 생성
 
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Main Page'), // 메인 화면 제목
        actions: [
          IconButton(
            onPressed: () async {
              // 로그아웃 시 상태 삭제
              await _authService.logout();
              // 로그아웃 후 로그인 페이지로 이동
              Get.offAll(() => LoginPage());
            },
            icon: const Icon(Icons.logout), // 로그아웃 버튼 아이콘
          ),
        ],
      ),
      body: const Center(
        child: Text('Welcome to Main Page!'), // 메인 화면 환영 메시지
      ),
    );
  }
}

🚀

4. main.dart 파일 수정 🔗

lib/main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
 
import 'package:navigationbar_example/view/login_page.dart';
import 'package:navigationbar_example/view/main_page.dart';
import 'package:navigationbar_example/viewModel/auth_service.dart';
 
void main() {
  runApp(MyApp());
}
 
class MyApp extends StatelessWidget {
  final AuthService _authService = AuthService();
  MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp( 	// GetMaterialApp으로 변경하여 GetX 사용
      debugShowCheckedModeBanner: false,
      home: FutureBuilder<bool>(
        future: _authService.getLoginState(),	// 로그인 상태 확인 함수 호출 (비동기 처리)
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            // 로그인 상태 확인 중일 때 로딩 화면 표시
            return const Center(child: CircularProgressIndicator());
          }
          if (snapshot.data == true) {
            // 로그인 상태가 true일 때 MainPage로 이동
            return MainPage();
          } else {
            // 로그인 상태가 false일 때 LoginPage로 이동
            return LoginPage();
          }
        },
      ),
    );
  }
}

🚀

5. 실행 결과 확인 🔗

앱을 실행하면 로그인 페이지가 표시됩니다. 로그인 버튼을 누르면 메인 페이지로 이동하고, 로그아웃 버튼을 누르면 로그인 페이지로 이동합니다.
image

🚀

결론 🔗

이번 포스팅에서는 FlutterSecureStorage 패키지를 사용하여 로그인 상태를 저장하고, Get 패키지를 사용하여 페이지 이동을 구현하는 방법을 알아보았습니다.
다음 포스팅에서는 로그인 후 메인 페이지를 하단 네비게이션 바로 구성하는 방법을 알아보겠습니다.

더 생각해 보기 🔗

로그아웃 시 로그아웃 확인 팝업을 띄우는 방법에는 어떤 것이 있을까요?

참고 🔗