Проверка 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,
                ),
 ...
Другие вопросы по тегам