Fluttor

Flutter로 로그인 페이지 구현하기

청춘고양이 2024. 7. 1. 11:01
반응형

Flutter를 사용하여 아름답고 기능적인 로그인 페이지를 만드는 방법을 배워보세요. 이 포스팅에서는 Firebase Authentication을 사용하여 이메일과 비밀번호를 통해 로그인하는 방법을 다룹니다.

1. 프로젝트 설정

Flutter 프로젝트 생성

먼저 Flutter 프로젝트를 생성합니다.

flutter create login_demo
cd login_demo

Firebase 설정

Firebase 프로젝트를 생성하고, Firebase Authentication을 설정합니다. 프로젝트의 android 및 ios 폴더에 google-services.json 및 GoogleService-Info.plist 파일을 추가합니다.

필요한 패키지 추가

pubspec.yaml 파일에 Firebase 관련 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  firebase_core: latest_version
  firebase_auth: latest_version
  cloud_firestore: latest_version

패키지를 설치합니다.

flutter pub get

2. Firebase 초기화

main.dart 파일에서 Firebase를 초기화합니다.

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'login_page.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Login Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginPage(),
    );
  }
}

3. 로그인 페이지 구현

login_page.dart 파일을 생성하고, 로그인 페이지 UI를 구현합니다.

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();

  // 로그인 함수
  Future<void> signIn() async {
    try {
      await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: emailController.text,
        password: passwordController.text,
      );
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (context) => HomePage()),
      );
    } on FirebaseAuthException catch (e) {
      print('Failed with error code: ${e.code}');
      print(e.message);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('로그인'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: emailController,
              decoration: InputDecoration(
                labelText: '이메일',
              ),
            ),
            TextField(
              controller: passwordController,
              decoration: InputDecoration(
                labelText: '비밀번호',
              ),
              obscureText: true,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: signIn,
              child: Text('로그인'),
            ),
          ],
        ),
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('홈 페이지'),
      ),
      body: Center(
        child: Text('로그인 성공!'),
      ),
    );
  }
}

4. 회원가입 페이지 추가

register_page.dart 파일을 생성하고, 회원가입 페이지를 구현합니다.

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class RegisterPage extends StatefulWidget {
  @override
  _RegisterPageState createState() => _RegisterPageState();
}

class _RegisterPageState extends State<RegisterPage> {
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();

  // 회원가입 함수
  Future<void> register() async {
    try {
      await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: emailController.text,
        password: passwordController.text,
      );
      Navigator.pop(context);
    } on FirebaseAuthException catch (e) {
      print('Failed with error code: ${e.code}');
      print(e.message);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('회원가입'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: emailController,
              decoration: InputDecoration(
                labelText: '이메일',
              ),
            ),
            TextField(
              controller: passwordController,
              decoration: InputDecoration(
                labelText: '비밀번호',
              ),
              obscureText: true,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: register,
              child: Text('회원가입'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 로그인 및 회원가입 페이지 연결

로그인 페이지에서 회원가입 페이지로 이동할 수 있도록 버튼을 추가합니다.

ElevatedButton(
  onPressed: signIn,
  child: Text('로그인'),
),
TextButton(
  onPressed: () {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => RegisterPage()),
    );
  },
  child: Text('회원가입'),
),

마무리

이제 Flutter와 Firebase를 사용하여 기본적인 로그인 및 회원가입 페이지를 구현했습니다. 이 프로젝트를 확장하여 사용자 인증, 비밀번호 재설정, 이메일 확인 등의 기능을 추가할 수 있습니다.

여러분의 프로젝트에 이 포스팅이 도움이 되길 바랍니다! 질문이나 피드백이 있다면 댓글로 남겨주세요.

반응형