Отправка формы после validate в Flutter
Типичный сценарий: пользователь нажимает
«Сохранить», форма проверяет все
TextFormField,
и только при успехе код читает данные.
Метод validate() у
Form
возвращает true, если каждый
валидатор вернул null.
Ключ GlobalKey<FormState> хранят
в State.
Текст поля по-прежнему удобно брать из
TextEditingController после
успешной проверки - так не нужно дублировать
строку в отдельной переменной:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final formKey = GlobalKey<FormState>();
final emailController = TextEditingController();
String lastSaved = '';
@override
void dispose() {
emailController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(16),
child: Form(
key: formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextFormField(
controller: emailController,
decoration: const InputDecoration(
labelText: 'Mail',
border: OutlineInputBorder(),
),
validator: (value) {
if (value == null || value.trim().isEmpty) {
return 'Enter email';
}
return null;
},
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
final ok = formKey.currentState!.validate();
if (!ok) return;
setState(() {
lastSaved = emailController.text.trim();
});
},
child: const Text('Save'),
),
const SizedBox(height: 16),
Text('Saved: $lastSaved'),
],
),
),
),
);
}
}
Соберите форму с полем 'Last name',
валидатором на пустую строку и кнопкой
'Send'. При успешной
validate() выведите фамилию
из controller.text в Text
ниже кнопки.