Flutter를 사용하여 앱을 개발할 때 로그인 화면은 매우 중요한 요소입니다. 로그인 화면을 통해 사용자는 계정에 접근하고, 개인화된 기능을 이용할 수 있습니다. 이번 글에서는 Flutter에서 로그인 화면을 구현하는 방법과 이를 커스터마이징하는 예제를 자세히 살펴보겠습니다.
1. 기본 로그인 화면 구성
로그인 화면을 구현하기 위해 Flutter에서 제공하는 TextField와 ElevatedButton 위젯을 사용합니다. 다음은 기본적인 로그인 화면을 구현한 예제입니다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: LoginScreen(),
);
}
}
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.emailAddress,
),
SizedBox(height: 20),
TextField(
controller: _passwordController,
decoration: InputDecoration(
labelText: 'Password',
border: OutlineInputBorder(),
),
obscureText: true,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// Implement login logic here
},
child: Text('Login'),
),
],
),
),
),
);
}
}
위 코드는 기본적인 로그인 화면을 구현한 예제입니다. TextField 위젯을 사용하여 이메일과 비밀번호 입력 필드를 만들고, ElevatedButton 위젯을 사용하여 로그인 버튼을 생성합니다.
2. 로그인 로직 구현
로그인 버튼을 눌렀을 때 입력된 이메일과 비밀번호를 사용하여 로그인 로직을 구현할 수 있습니다. 이 예제에서는 간단한 유효성 검사를 추가하고, 성공적인 로그인 후 다음 화면으로 이동하는 로직을 구현합니다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: LoginScreen(),
);
}
}
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
void _login() {
if (_formKey.currentState!.validate()) {
// Implement actual login logic here
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextFormField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
border: OutlineInputBorder(),
),
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
return null;
},
),
SizedBox(height: 20),
TextFormField(
controller: _passwordController,
decoration: InputDecoration(
labelText: 'Password',
border: OutlineInputBorder(),
),
obscureText: true,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your password';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _login,
child: Text('Login'),
),
],
),
),
),
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home Screen')),
body: Center(
child: Text('Welcome to the Home Screen!'),
),
);
}
}
위 코드는 로그인 로직을 추가한 예제입니다. Form 위젯과 TextFormField 위젯을 사용하여 입력된 이메일과 비밀번호에 대해 유효성 검사를 수행하고, 로그인 성공 시 다음 화면으로 이동합니다.
3. 커스텀 디자인 적용
로그인 화면에 커스텀 디자인을 적용하여 사용자 경험을 향상시킬 수 있습니다. 다음은 로그인 화면에 배경 이미지와 스타일을 추가한 예제입니다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: LoginScreen(),
);
}
}
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
void _login() {
if (_formKey.currentState!.validate()) {
// Implement actual login logic here
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
fit: StackFit.expand,
children: [
Image.asset(
'assets/background.jpg',
fit: BoxFit.cover,
),
Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Login',
style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold, color: Colors.white),
),
SizedBox(height: 20),
TextFormField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
labelStyle: TextStyle(color: Colors.white),
filled: true,
fillColor: Colors.white.withOpacity(0.8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
return null;
},
),
SizedBox(height: 20),
TextFormField(
controller: _passwordController,
decoration: InputDecoration(
labelText: 'Password',
labelStyle: TextStyle(color: Colors.white),
filled: true,
fillColor: Colors.white.withOpacity(0.8),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
obscureText: true,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your password';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _login,
child: Text('Login'),
),
],
),
),
),
),
],
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home Screen')),
body: Center(
child: Text('Welcome to the Home Screen!'),
),
);
}
}
위 코드는 배경 이미지와 스타일을 추가하여 로그인 화면을 커스터마이징한 예제입니다. Stack 위젯을 사용하여 배경 이미지 위에 로그인 폼을 표시하며, 텍스트 필드와 버튼에 스타일을 적용하여 디자인을 향상시킵니다.
결론
Flutter에서 로그인 화면을 구현하면 사용자에게 계정 접근과 개인화된 기능을 제공할 수 있습니다. TextField와 ElevatedButton 위젯을 사용하여 기본적인 로그인 폼을 만들고, 유효성 검사와 로그인 로직을 추가하여 완성도 높은 로그인 화면을 구현할 수 있습니다. 또한, 커스텀 디자인을 적용하여 사용자 경험을 향상시킬 수 있습니다. 이번 글에서 소개한 방법들을 활용하여 Flutter 애플리케이션에서 매력적이고 기능적인 로그인 화면을 구현해보세요. 로그인 화면을 통해 사용자의 첫 인상을 더욱 좋게 만들 수 있습니다.
'Flutter' 카테고리의 다른 글
Flutter의 프로필 화면(Profile Screen) 만들기 (0) | 2025.01.17 |
---|---|
Flutter의 회원가입 화면(Sign Up Screen) 만들기 (0) | 2025.01.01 |
Flutter의 Splash Screen 만들기 (0) | 2024.11.09 |
Flutter의 온보딩 화면(Onboarding Screen) 만들기 (1) | 2024.10.16 |
Flutter의 캐러셀(Carousel) 위젯 사용법 (0) | 2024.10.15 |