Легкое взаимодействие с текстовыми полями во Flutter: отключение клавиатуры при нажатии TextField

Метод 1: использование класса FocusScope

Класс FocusScopeво Flutter предоставляет механизм управления состоянием фокуса виджетов. Чтобы отключить клавиатуру при нажатии на текстовое поле, мы можем обернуть текстовое поле виджетом FocusScopeи добавить к нему FocusNode. Вот пример:

FocusNode _focusNode = FocusNode();
Widget build(BuildContext context) {
  return FocusScope(
    node: FocusScopeNode(),
    child: TextField(
      focusNode: _focusNode,
      onTap: () {
        _focusNode.unfocus();
      },
      // Other TextField properties...
    ),
  );
}

Метод 2: использование виджета GestureDetector

Другой подход — использовать виджет GestureDetectorдля регистрации событий касания текстового поля и соответствующего отключения клавиатуры. Вот пример:

TextField(
  onTap: () {
    FocusManager.instance.primaryFocus?.unfocus();
  },
  // Other TextField properties...
),

Метод 3: расширение виджета TextField

Если вам часто нужна эта функция, вы можете создать собственный виджет TextField, который автоматически отключает клавиатуру при нажатии. Вот пример того, как этого можно добиться:

class DismissKeyboardTextField extends TextField {
  DismissKeyboardTextField({
    Key? key,
    TextEditingController? controller,
    TextInputType? keyboardType,
    TextInputAction? textInputAction,
    // Other TextField properties...
  }) : super(
          key: key,
          controller: controller,
          keyboardType: keyboardType,
          textInputAction: textInputAction,
          onTap: () {
            FocusManager.instance.primaryFocus?.unfocus();
          },
          // Other TextField properties...
        );
}

Метод 4: реализация пользовательского виджета FormField

Если вы используете виджет Formво Flutter, вы можете создать собственный виджет FormField, который автоматически закрывает клавиатуру при нажатии. Этот подход особенно полезен, когда в форме имеется несколько текстовых полей. Вот пример:

class DismissKeyboardFormField extends FormField<String> {
  DismissKeyboardFormField({
    Key? key,
    TextEditingController? controller,
    TextInputType? keyboardType,
    TextInputAction? textInputAction,
    // Other FormField properties...
  }) : super(
          key: key,
          initialValue: controller?.text,
          builder: (FormFieldState<String> field) {
            final InputDecoration effectiveDecoration = (decoration ?? const InputDecoration())
                .applyDefaults(Theme.of(field.context).inputDecorationTheme);
            return TextField(
              controller: controller,
              keyboardType: keyboardType,
              textInputAction: textInputAction,
              onTap: () {
                FocusManager.instance.primaryFocus?.unfocus();
                field.requestFocus();
              },
              // Other TextField properties...
            );
          },
        );
}

Включение любого из этих методов в ваше приложение Flutter позволит вам легко отключать клавиатуру, когда пользователь взаимодействует с текстовым полем, обеспечивая более плавное взаимодействие с пользователем.