flutter

Form, TextFormField

paulaner80 2020. 12. 4. 17:09
반응형

폼과 검증

 

텍스트 필드 한개가 있는 폼을 어떻게 검증하는지 알아보자

1.GlobalKey 가지는 Form 생성

2.검증로직을 가진 TextFormField 추가

3.폼에 검증(validation) 제출(submit) 하는 버튼 추가

 

 

 

1.GlobalKey 가지는 Form 생성

Form위젯은 여러개의 폼필드를 그룹핑하고 검증하도록 동작합니다.

폼을 생성할 .  GlobalKey 넣어줘야합니다. 이것으로 폼을 구분하고 나중에 검증할 사용합니다.

 

 

키생성

final _formKey = GlobalKey<FormState>();

 

 

_formKey 사용해서 Form위젯 빌드

Form(

          key : _formKey,

          child: Column(

            children: [],

          ),

      )

 

 

2.검증로직을 가진 TextFormField 추가

TextFormField  TextField Form으로 감싸고 있습니다.

그래서 검증이나 다름 폼필드와도 연동이 가능합니다.

 

TextFormField 검증 오류가 발생하면 에러를 화면에 표시해 있습니다.

입력값은 validator 넣어준 함수로 검증합니다.

함수는 에러메시지를 문자열로 리턴합니다. 에러가 없을 때는 null 리턴합니다.

 

 

 

TextFormField(

  validator: (value){

   if(value.isNotEmpty){

      return "Please Enter some Text";

    }

    return null;

 },

)

 

 

 

3.폼에 검증(validation) 제출(submit) 하는 버튼 추가

   ElevatedButton(

     onPressed: (){

        if(_formKey.currentState.validate()){

          Scaffold.of(context).showSnackBar(SnackBar(content: Text("Processing data"),));

       }

      },

      child: Text("submit"),

    )

 

3-1.snackBar 출력방법

final scaffoldKey = GlobalKey<ScaffoldState>();

 

 

Scaffold(

key : scaffoldKey,

 

 

 

scaffoldKey.currentState.showSnackBar(SnackBar(content:Text("Processing data")));




4. 버튼 enable, disable 방법

btnEnabled 변수를 활용하여 처리함.




[전체소스]

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appTitle = 'Form Validation Demo';

return MaterialApp(
title: appTitle,
home: MyCustomForm(appTitle)
);
}
}



class MyCustomForm extends StatefulWidget {

String title;

MyCustomForm(this.title);

@override
MyCustomFormState createState() {
print(" MyCustomForm createState");
return MyCustomFormState();
}

}

class MyCustomFormState extends State<MyCustomForm>{

final _formKey = GlobalKey<FormState>();

final scaffoldKey = GlobalKey<ScaffoldState>();

String inputId = "";
String inputPw = "";

bool _btnEnabled = false;

@override
Widget build(BuildContext context) {

//3번 호출되는데 이유를 모르겠다.
print(' bbbbbbbbbbbbbbbbbbuild');

return
Scaffold(
key : scaffoldKey,
appBar: AppBar(
title: Text(widget.title),
),
body:Form(
key : _formKey,
onChanged: (){
var b = _formKey.currentState.validate();
setState(() => _btnEnabled = _formKey.currentState.validate());
print(" bbbbbbbbbbbbbbbbb ${b}");
},
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextFormField(
autofocus: true,
validator: (value){
print("id) value.isEmpty : ${value.isEmpty}");
if(value.isEmpty){
// _btnEnabled = false;
return "아이디를 입력해주세요";
}
// _btnEnabled = true;
return null;
},
decoration: InputDecoration(
labelText: "ID",
hintText:"아이디",),

//_formKey.currentState.save();로 호출
onSaved: (value){
inputId = value;
},
),
TextFormField(
validator: (value){
if(value.isEmpty){
return "패스워드를 입력해주세요";
}

return null;
},
decoration: InputDecoration(
labelText: "PW",
hintText:"패스워드",),

//_formKey.currentState.save();로 호출
onSaved: (value){
inputPw = value;
},
),
RaisedButton(
onPressed: _btnEnabled == true ? (){
if(_formKey.currentState.validate()){
///이걸해줘야. 폼들 각각의 onSaved가 호출되어
///inputId, inputPw에 값이 들어간다.
_formKey.currentState.save();
scaffoldKey.currentState.showSnackBar(
SnackBar(
content:Text('Processing data inputId : ${inputId}, inputPw : ${inputPw}')));
}
} : null,
child: Text("submit"),
)
],
),
)
),
);
}
}


'flutter' 카테고리의 다른 글

isolate를 이용하여 데이터 처리하기  (0) 2020.12.18
WidgetsBindingObserver  (0) 2020.12.08
데스트탑 플러터  (0) 2020.11.11
권한가져오기(checkPermissionStatus)  (0) 2019.11.13
폴더 경로 가져오기  (0) 2019.11.06