TextField에서 onChanged로 입력을 관리 시, 여러개의 TextField가 있으면 하나하나 처리해줘야 함. TextFormField를 사용하면 한 번에 처리를 할 수 있음
TextFormField renderTextFiled() {
return TextFormField(
validator: (String? val) {
if (val == null || val.isEmpty) {
return '값을 입력하세요';
}
return null;
},
cursorColor: Colors.grey,
maxLines: isTime ? 1 : null,
expands: !isTime,
keyboardType: isTime ? TextInputType.number : TextInputType.multiline,
inputFormatters: isTime ? [FilteringTextInputFormatter.digitsOnly] : [],
decoration: InputDecoration(
border: InputBorder.none,
filled: true,
fillColor: Colors.grey[300],
),
);
}
class FormForm extends State<ScheduleBottomSheet> {
final GlobalKey<FormState> formKey = GlobalKey();
Widget build(BuildContext context) {
return Container(
child: Form(
key: formKey,
//autovalidateMode: AutovalidateMode.always,
child: Column(
children: [
CustomTextFiled(label: '시작 시간', isTime: true),
CustomTextFiled(label: '시작 시간', isTime: true),
_SaveButton(onPressed: onSavePressed),
],
),
),
);
}
void onSavePressed() {
// formKey는 생성했으나, From Widget과 결합이 안된 상태
// 위에서는 key: formKey로 연결을 해주고 있음
// 다른 동료가 삭제할 가능성도 있기에, 추가
if (formKey.currentState == null) {
return;
}
// 위에서 null check가 되어서, null일 수 없기에 formKey.currentState!
if (formKey.currentState!.validate()) {
print('에러가 없습니다.');
} else {
print('에러!!!!!!');
}
}
}
class MyTextFormFiled extends StatelessWidget {
final FormFieldSetter<String> onSaved;
const CustomTextFiled({
Key? key,
required this.onSaved,
}) : super(key: key);
Widget build(BuildContext context) {
return Column(
children: [
TextFormField(onSaved: onSaved),
TextFormField(onSaved: onSaved),
],
);
}
}