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