목표, 조건 설정 및 초기설정, 개요 링크 이 포스팅은 Flutter 3.24 버전 기준으로 작성되었습니다.
📦 lib
┣ 📂 model				// 데이터 보관하는 모델 폴더(이번 포스팅에서는 사용하지 않음)
┣ 📂 view				// 화면을 구성하는 뷰 폴더
┃ ┣ 📜 login_page.dart
┃ ┗ 📜 main_page.dart
┣ 📂 viewModel			// 데이터와 화면을 잇는 viewModel 폴더
┃ ┗ 📜 auth_service.dart
┗ 📜 main.dartimport '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');
  }
}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'), // 로그인 버튼 텍스트
        ),
      ),
    );
  }
}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!'), // 메인 화면 환영 메시지
      ),
    );
  }
}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();
          }
        },
      ),
    );
  }
}