Flutter
[Flutter] Validation
에릭 Kim
2022. 6. 28. 22:31
반응형
서비스에 회원가입을 할 때 이메일과 비밀번호를 활용하여 가입을 하는 경우가 많은데, 정해진 양식에 따라 회원가입 절차를 진행하기 위한 Validation에 대해서 알아보겠습니다 !!
설치
1. 먼저 yaml 파일에 email_validator 패키지를 추가해줍니다.
dependencies:
email_validator: '^1.0.6'
2. pub get 버튼으로 패키지를 설치해줍니다.
3. 사용하고자 하는 dart 파일에 설치한 패키지를 import 해줍니다.
import 'package:email_validator/email_validator.dart';
사용
1. validation을 확인하기 위한 form 상태를 저장할 변수를 만들어줍니다.
2. 이메일과 비밀번호를 입력받을 변수를 String으로 만들어줍니다.
final _formKey = GlobalKey<FormState>();
String userEmail = '';
String userPassword = '';
3. validation 메소드를 만들어주는데 만약 formkey의 현재 상태가 인증된 상태이면 "Validated"를, 아닌 상태라면 "Not Validated"를 콘솔에 출력해줍니다.
void validation() {
if (_formKey.currentState!.validate()) {
print("Validated");
} else {
print("Not Validated");
}
}
4. TextFormField에 validator, onSaved, onChanged 추가
TextFormField를 사용하여 사용자 입력값을 받을 수 있습니다.
- validator(): validator(value)로 전달하는 value값의 조건을 확인할 수 있습니다. 여기서 value가 비어 있으면 '이메일을 입력해주세요' 메세지가 리턴되고, value가 이메일 형식에 맞지 않으면 '이메일 형식에 맞춰주세요' 메세지가 리턴됩니다.
- onSaved(): 입력된 값을 저장하는 함수입니다. 비동기처리를 하여 최종적으로 입력이 완료 되었을 때 State를 변경하여 값을 저장해줍니다.
- onChanged(): 입력된 값의 변경을 보여주는 함수 입니다. 사용자의 입력값이 바뀔 때마다 변경 사항으로 State를 변경하여 값을 저장합니다.
TextFormField(
validator: (value) {
if (value!.isEmpty) {
// 이메일 입력란이 비어있으면 '이메일을 입력해주세요' 리턴
return "이메일을 입력해주세요";
} else if (!EmailValidator.validate(value.toString())) {
// 입력값이 이메일 형식에 맞지 않으면 '이메일 형식을 맞춰주세요를 리턴
return "이메일 형식을 맞춰주세요";
} else {
return null;
}
},
onSaved: (value) async {
userEmail = value!;
},
onChanged: (value) {
userEmail = value;
},
비밀번호의 validation도 같은 맥락입니다 !
TextFormField(
validator: (value) {
if (value!.isEmpty || value.length < 6) {
// 비밀번호 입력란이 비어 있거나, 비밀번호가 설정해둔 자릿수 미만이면, '최소 6자리로 비밀번호를 설정해주세요' 리턴
return "최소 6자리로 비밀번호를 설정해주세요";
} else {
return null;
}
},
onSaved: (value) {
userPassword = value!;
},
onChanged: (value) {
userPassword = value;
},
5. 이메일과 비밀번호가 제대로 입력되었다면 설정해둔 페이지로 넘어가게 됩니다
RaisedButton(
child: const Text('다음'),
textColor: Colors.white,
color: Color(0xff936DFF),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20)),
onPressed: () async {
// _tryValidation();
validation();
print(userEmail);
print(userPassword);
if (userEmail != '' && userPassword != '') {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => (homePage())),
);
} else {}
}),
전체 소스코드
import 'package:flutter/material.dart';
import 'package:email_validator/email_validator.dart';
import '../home.dart';
class RegisterPage extends StatefulWidget {
const RegisterPage({Key? key}) : super(key: key);
@override
State<RegisterPage> createState() => _RegisterPageState();
}
class _RegisterPageState extends State<RegisterPage> {
// bool isSignupscreen = true;
final _formKey = GlobalKey<FormState>();
String userEmail = '';
String userPassword = '';
void validation() {
if (_formKey.currentState!.validate()) {
print("Validated");
} else {
print("Not Validated");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
foregroundColor: const Color(0xffb936DFF),
backgroundColor: Colors.white,
leading: IconButton(
onPressed: () {
Navigator.pop(context); //뒤로가기
},
icon: Icon(
Icons.arrow_back,
color: Colors.white,
)),
),
body: Padding(
padding: EdgeInsets.fromLTRB(40.0, 120.0, 40.0, 0.0),
child: SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
const Text(
'회원가입 ',
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: Color(0xff5A5A5A)),
),
const SizedBox(
height: 20.0,
),
Container(
padding: EdgeInsets.only(left: 8),
height: 20.0,
child: const Text(
'이메일 ',
style: TextStyle(color: const Color(0xffb5A5A5A)),
),
),
const SizedBox(
height: 6.0,
),
Column(
children: [
//이메일 입력
TextFormField(
validator: (value) {
if (value!.isEmpty) {
// 이메일 입력란이 비어있으면 '이메일을 입력해주세요' 리턴
return "이메일을 입력해주세요";
} else if (!EmailValidator.validate(value.toString())) {
// 입력값이 이메일 형식에 맞지 않으면 '이메일 형식을 맞춰주세요를 리턴
return "이메일 형식을 맞춰주세요";
} else {
return null;
}
},
onSaved: (value) async {
userEmail = value!;
},
onChanged: (value) {
userEmail = value;
},
decoration: const InputDecoration(
border: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: const Color(0xffbD5D5D5)),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: const Color(0xffb936DFF)),
),
filled: true,
fillColor: Colors.white,
labelText: '이메일',
labelStyle: TextStyle(color: const Color(0xffD5D5D5))),
// onChanged: (value){
// userEmail = value;
// },
),
],
),
const SizedBox(
height: 10.0,
),
Container(
padding: EdgeInsets.only(left: 8),
height: 20.0,
child: const Text(
'비밀번호 ',
style: TextStyle(color: const Color(0xffb5A5A5A)),
),
),
const SizedBox(
height: 6.0,
),
//비밀번호 입력
TextFormField(
validator: (value) {
if (value!.isEmpty || value.length < 6) {
// 비밀번호 입력란이 비어 있거나, 비밀번호가 설정해둔 자릿수 미만이면, '최소 6자리로 비밀번호를 설정해주세요' 리턴
return "최소 6자리로 비밀번호를 설정해주세요";
} else {
return null;
}
},
onSaved: (value) {
userPassword = value!;
},
onChanged: (value) {
userPassword = value;
},
obscureText: true,
decoration: const InputDecoration(
border: OutlineInputBorder(
borderSide:
BorderSide(width: 1, color: const Color(0xffbD5D5D5)),
),
focusedBorder: OutlineInputBorder(
borderSide:
BorderSide(width: 1, color: const Color(0xffb936DFF)),
),
filled: true,
fillColor: Colors.white,
labelText: '비밀번호를 입력해주세요',
labelStyle: TextStyle(color: const Color(0xffD5D5D5))),
),
//확인 버튼
SizedBox(
height: 30,
),
RaisedButton(
child: const Text('다음'),
textColor: Colors.white,
color: Color(0xff936DFF),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20)),
onPressed: () async {
// _tryValidation();
validation();
print(userEmail);
print(userPassword);
if (userEmail != '' && userPassword != '') {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => (homePage())),
);
} else {}
}),
],
),
)),
),
);
}
}
반응형