Form 자체는 검증 및 저장 기능만 제공하며, 입력 필드(TextFormField 등)의 validator나 onSaved 메서드와 함께 사용됩니다.Form(
key: formKey, // GlobalKey를 연결
child: Column(
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Name'),
validator: (val) => val == null || val.isEmpty ? 'Enter your name' : null,
onSaved: (val) => print('Saved Name: $val'),
),
ElevatedButton(
onPressed: () {
if (formKey.currentState!.validate()) { // 모든 입력 필드 검증
formKey.currentState!.save(); // 모든 입력 필드의 onSaved 호출
}
},
child: Text('Submit'),
),
],
),
)
Form)의 상태를 추적하고 조작할 수 있는 키입니다.Form의 상태를 변경하거나 검증 결과를 확인하려면 GlobalKey<FormState>를 사용해야 합니다.Form의 상태를 직접 조작할 수 없습니다.GlobalKey를 통해 외부에서 Form의 상태(currentState)에 접근할 수 있습니다.GlobalKey 선언:
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
Form에 연결:
Form(key: formKey, child: ...)
상태 접근:
formKey.currentState!.validate()formKey.currentState!.save()GlobalKey 객체로, Form 위젯을 조작하기 위한 도구입니다.Form의 상태(currentState)에 접근하고 조작하기 위해 사용됩니다.formKey.currentState의 주요 메서드:validate():validator를 호출합니다.false를 반환, 모두 통과하면 true 반환.save():onSaved 메서드를 호출합니다.TextFormField의 validator를 호출.validator가 에러 메시지를 반환하면 입력 필드에 오류가 표시되고, false 반환.true 반환.if (formKey.currentState!.validate()) {
print('모든 입력이 유효합니다.');
} else {
print('입력이 잘못되었습니다.');
}
TextFormField의 onSaved 메서드를 호출.if (formKey.currentState!.validate()) {
formKey.currentState!.save(); // 모든 입력 필드의 onSaved 실행
print('데이터가 저장되었습니다.');
}
TextFormField에 입력된 값을 검증합니다.validator: (val) {
if (val == null || val.isEmpty) {
return '이 필드를 입력하세요.';
}
if (val.length < 3) {
return '최소 3글자 이상 입력하세요.';
}
return null; // 유효한 경우
},
TextFormField에 입력된 값을 저장하는 로직을 정의합니다.save() 호출 시 실행됩니다.onSaved: (val) {
print('입력값이 저장되었습니다: $val');
},
schedule_bottom_sheet.dart_Time 클래스에서 Form과 관련 메서드 사용:class _Time extends StatelessWidget {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
Widget build(BuildContext context) {
return Form(
key: formKey,
child: Column(
children: [
Row(
children: [
Expanded(
child: CustomTextField(
label: '시작 시간',
onSaved: (val) => print('시작 시간: $val'),
validator: (val) => val == null || val.isEmpty
? '시작 시간을 입력하세요.'
: null,
),
),
Expanded(
child: CustomTextField(
label: '마감 시간',
onSaved: (val) => print('마감 시간: $val'),
validator: (val) => val == null || val.isEmpty
? '마감 시간을 입력하세요.'
: null,
),
),
],
),
ElevatedButton(
onPressed: () {
if (formKey.currentState!.validate()) {
formKey.currentState!.save();
print('폼 데이터 저장 완료');
} else {
print('폼 검증 실패');
}
},
child: Text('SAVE'),
),
],
),
);
}
}
validate() 호출 → 모든 필드 검증.save() 호출 → 입력값 저장.validator에서 에러 메시지 반환 → 필드 아래 표시.| 요소 | 역할 및 사용 예시 |
|---|---|
| Form | 입력 필드들을 그룹화하고, validate()와 save()를 통해 데이터를 관리. |
| GlobalKey | Form의 상태를 추적하고 조작하기 위한 키. |
| formKey | GlobalKey를 이용해 Form의 상태를 저장. |
| formKey.currentState!.validate() | 입력 필드들의 유효성을 확인. validator를 호출하여 검증. |
| formKey.currentState!.save() | 입력 필드들의 데이터를 저장. onSaved 호출. |
| validator | 입력 필드의 데이터를 검증하는 로직. |
| onSaved | 검증된 데이터를 저장하거나 처리하는 로직. |
이제 각 요소가 어떻게 서로 연결되어 동작하는지 명확히 이해했길 바랍니다! 😊