[Flutter] 연습하기 4 - Flutter Login app

2025. 1. 13. 18:23·Flutter/App
728x90

▼ 좀 더 자세히 알고싶다면 아래의 GitHub를 참고하세요!!

 

GitHub - flutter-coder/flutter-book

Contribute to flutter-coder/flutter-book development by creating an account on GitHub.

github.com

프로젝트 소개

Flutter를 사용하여 로그인 화면과 홈 화면을 구현합니다. 

  1. StatelessWidget과 StatefulWidget의 사용법.
  2. TextFormField를 활용한 입력 폼 구성.
  3. Navigator를 사용한 화면 전환.
  4. Material Design을 활용한 UI 구성.

주요 기능

  1. 이메일 및 비밀번호 입력 폼.
  2. 입력 데이터의 유효성 검사 및 저장.
  3. 로그인 버튼 클릭 시 홈 화면으로 전환.
이미지 다운로드 해주세요


프로젝트 파일 구조

1. pubspec.yaml 설정

pubspec.yaml 파일은 프로젝트의 의존성과 자원을 관리합니다.
필요한 의존성을 추가하고, assets 폴더의 로고 이미지를 등록합니다.

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.8
  flutter_svg: ^2.0.17

flutter:
  uses-material-design: true
  assets:
    - assets/logo.svg

2. 전역 상수 관리 (size.dart)

여백, 크기 등을 상수로 정의하여 프로젝트 전반에서 일관되게 사용할 수 있도록 합니다.

const double smallGap = 5.0;
const double mediumGap = 10.0;
const double largeGap = 20.0;
const double xlargeGap = 100.0;

3. 메인 진입점 (main.dart)

MaterialApp을 구성하고, 초기 화면(LoginPage)과 화면 전환(HomePage)을 설정합니다.

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        textButtonTheme: TextButtonThemeData(
          style: TextButton.styleFrom(
            backgroundColor: Colors.black,
            foregroundColor: Colors.white,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(30.0),
            ),
            minimumSize: Size(400, 60),
          ),
        ),
      ),
      initialRoute: '/login',
      routes: {
        '/login': (context) => LoginPage(),
        '/home': (context) => HomePage(),
      },
    );
  }
}

4. 컴포넌트 제작

(1) 텍스트 입력 필드 (custom_form_text_field.dart)

class CustomTextFormField extends StatelessWidget {
  final String label;
  final FormFieldSetter<String>? onSaved;

  const CustomTextFormField(this.label, this.onSaved);

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      decoration: InputDecoration(
        labelText: label,
        border: OutlineInputBorder(),
      ),
      validator: (value) {
        if (value == null || value.isEmpty) {
          return '${label}을 입력하세요';
        }
        return null;
      },
      onSaved: onSaved,
    );
  }
}

 

(2) 입력 폼 제작 (custom_form.dart)

class CustomForm extends StatelessWidget {
  final _formKey = GlobalKey<FormState>();
  String _email = '';
  String _password = '';

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          CustomTextFormField('Email', (value) {
            _email = value ?? '';
          }),
          SizedBox(height: mediumGap),
          CustomTextFormField('Password', (value) {
            _password = value ?? '';
          }),
          SizedBox(height: largeGap),
          TextButton(
            onPressed: () {
              if (_formKey.currentState!.validate()) {
                _formKey.currentState!.save();
                Navigator.pushNamed(context, '/home');
              }
            },
            child: Text('Login'),
          ),
        ],
      ),
    );
  }
}

5. 페이지 구성

(1) 로그인 페이지 (login_page.dart) 

class LoginPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 20.0),
        child: ListView(
          children: [
            SizedBox(height: xlargeGap),
            Logo('Login'),
            SizedBox(height: largeGap),
            CustomForm(),
          ],
        ),
      ),
    );
  }
}

 

(2) 홈 페이지 (home_page.dart) - 로그인 후 이동하게 될 화면

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Column(
          children: [
            SizedBox(height: xlargeGap),
            Logo('Care Soft'),
            SizedBox(height: largeGap),
            TextButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('Get Started'),
            ),
          ],
        ),
      ),
    );
  }
}

▼로그인 앱 완성 화면

'Flutter > App' 카테고리의 다른 글

[Flutter] 상태 관리 앱 만들기 (stl, stf)  (1) 2025.02.03
[Flutter] 연습하기 4 - Flutter Shopping Cart app  (1) 2025.01.14
[Flutter] Flutter Scroll Wiget  (2) 2025.01.08
[Flutter] 연습하기 3 - flutter profile app  (1) 2025.01.08
[Flutter] 연습하기 2 - flutter recipe app  (2) 2025.01.08
'Flutter/App' 카테고리의 다른 글
  • [Flutter] 상태 관리 앱 만들기 (stl, stf)
  • [Flutter] 연습하기 4 - Flutter Shopping Cart app
  • [Flutter] Flutter Scroll Wiget
  • [Flutter] 연습하기 3 - flutter profile app
공돌이 출신 개발자
공돌이 출신 개발자
공돌이 출신 개발자입니다
  • 공돌이 출신 개발자
    공돌이 출신 개발자
    공돌이 출신 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (124)
      • Database (0)
        • SQL (0)
        • 1일 1쿼리 (9)
      • Flutter (40)
        • Dart 언어 (18)
        • App (22)
      • Git (0)
      • Http 기초 지식 (14)
      • HTML5 & CSS3 (0)
      • Java (33)
      • JSP (0)
      • JavaScript (0)
      • Linux (0)
      • MSA (0)
      • Project (0)
      • React (0)
      • Spring (19)
      • 설치 메뉴얼 (1)
      • [Flutter] 프로젝트 (눈길) (8)
        • 작업일지 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    객체지향
    안드로이드 앱 개발
    HTTP
    코딩
    데이터
    플러터
    spring boot
    SQL
    객체
    android studio
    앱 개발
    개발
    프로젝트
    블로그 만들기
    flutter
    JAVA 기초
    Android
    SQLD
    jsp
    회원가입
    프로그래밍
    안드로이드
    클래스
    공부
    1일1쿼리
    로그인
    메서드
    Java
    앱개발
    dart
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
공돌이 출신 개발자
[Flutter] 연습하기 4 - Flutter Login app
상단으로

티스토리툴바