Проверка TextFormField с помощью флаттер-крючков
Я пытаюсь перейти на flutter_hooks, но не могу заставить работать простую проверку textformField.
У меня есть 2 текстовых поля и кнопка, и я хотел бы показать ошибку при некоторых условиях (или, по крайней мере, когда текстовое поле пусто)
Мой код: -контроллеры:
final _emailFieldController =
useTextEditingController.fromValue(TextEditingValue.empty);
final _password =
useTextEditingController.fromValue(TextEditingValue.empty);
final _onSavePressed = useState(false);
-виджеты:
TextFormField(
decoration: InputDecoration(hintText: "Your email"),
controller: _emailFieldController,
),
TextFormField(
obscureText: true,
onSaved: (newValue) => print(newValue),
validator: (value) =>
_onSavePressed.value && _password.text.isEmpty
? "Can't be empty"
: null,
decoration: InputDecoration(
hintText: "Password",
),
controller: _password,
),
RaisedButton(
child: Text("Create"),
onPressed: () {
_onSavePressed.value = true;
},
)
Спасибо за помощь!
2 ответа
Решение
Использовать
value
что вы получаете от валидатора. например
validator: (value) => value.isEmpty ? "Can't be empty" : null
дает вам доступ к значению поля пароля.
Я делаю именно это в своем учебнике по Flutter :
class BookDetailsPage extends HookWidget {
BookDetailsPage({
Key? key,
this.bookId,
}) : super(key: key);
final int? bookId;
final _bookFormKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
final titleTextController = useTextEditingController(text: book?.title ?? '');
final authorTextController = useTextEditingController(text: book?.author ?? '');
final publishDateTextController = useTextEditingController(text: book?.publicationDate.toString() ?? '');
return Scaffold(
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(AppDimensions.l),
child: Form(
key: _bookFormKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
AppTextEdit(
labelText: LocaleKeys.books_details_book_title.tr(),
textInputType: TextInputType.name,
textEditingController: titleTextController,
validator: (value) => (value == null || value.isEmpty) ? '' : null,
),
const SizedBox(height: AppDimensions.l),
AppTextEdit(
labelText: LocaleKeys.books_details_author.tr(),
textEditingController: authorTextController,
textInputType: TextInputType.name,
validator: (value) => (value == null || value.isEmpty) ? '' : null,
),
const SizedBox(height: AppDimensions.l),
AppTextEdit(
labelText: LocaleKeys.books_details_publish_date.tr(),
textInputType: TextInputType.number,
textEditingController: publishDateTextController,
validator: (value) => (value == null || value.isEmpty || int.tryParse(value) == null) ? '' : null,
),
...