Как скрыть мягкую клавиатуру ввода на флаттер после щелчка вне TextField/где-нибудь на экране?

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

FocusScope.of(context).requestFocus(new FocusNode());

Но я хочу скрыть мягкую клавиатуру, щелкнув вне TextField или в любом месте экрана. Есть ли какой-нибудь метод в трепете?

Ответы

Ответ 1

Вы делаете это неправильно, просто попробуйте этот простой способ, чтобы скрыть программную клавиатуру. вам просто нужно обернуть вам весь экран в GestureDetector методе и onTap методе писать этот код.

        FocusScope.of(context).requestFocus(new FocusNode());

Вот полный пример:

new Scaffold(

body: new GestureDetector(
  onTap: () {

    FocusScope.of(context).requestFocus(new FocusNode());
  },
child: new Container(
   //rest of your code write here
    )
 )

Ответ 2

Оберните весь экран в GestureDetector как

new Scaffold(

  body: new GestureDetector(
      onTap: () {
        // call this method here to hide soft keyboard
        FocusScope.of(context).requestFocus(new FocusNode());
      },
    child: new Container(
       -
       -
       -
        )
   )

Ответ 3

обновленный

Начиная с начала мая 2019 года, у FocusNode теперь есть метод unfocus:

Отменяет любые невыполненные запросы на фокус.

Этот метод безопасно вызывать независимо от того, запрашивал ли этот узел фокус.

Используйте unfocus если вы объявили FocusNode для программной фокусировки текстовых полей:

final focusNode = FocusNode();

// ...

focusNode.unfocus();

Мой оригинальный ответ предложил метод detach - используйте его, только если вам нужно полностью избавиться от вашего FocusNode. Если вы планируете держать это рядом - используйте unfocus.

Если вы специально не объявили FocusNode - используйте "обычный" метод:

FocusScope.of(context).requestFocus(new FocusNode());

Оригинальный ответ

Я вижу, что все используют FocusScope.of(context).requestFocus(new FocusNode()); не фокусировать текстовое поле, и мне кажется, что это неправильно.

IMO создает только новый бесполезный объект, который висит, пока пользователь не FocusNode текстового поля с "настоящим" FocusNode.

Если бы вы искали "правильный" способ 1) отклонить клавиатуру 2) расфокусировать текстовое поле - я мог бы найти правильный способ сделать это:

FocusScope.of(context).detach();

Официальные документы говорят, что использовать detach безопасно, даже если в фокусе нет узла.


Однако, если вы хотите только скрыть клавиатуру без потери фокуса текстового поля (по какой-то причине) - вы можете попробовать это:
import 'package:flutter/services.dart' show SystemChannels;

SystemChannels.textInput.invokeMethod('TextInput.hide');

Ответ 4

Я добавил эту строку

behavior: HitTestBehavior.opaque,

к GestureDetector, и он, кажется, работает сейчас, как и ожидалось.

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context).calculatorAdvancedStageTitle),
      ),
      body: GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () {
          FocusScope.of(context).requestFocus(new FocusNode());
        },
        child: Padding(
          padding: const EdgeInsets.only(
            left: 14,
            top: 8,
            right: 14,
            bottom: 8,
          ),
          child: Text('Work'),
        ),
      )
    );
  }

Ответ 5

GestureDetector(
  onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
  },
  behavior: HitTestBehavior.translucent,
  child: rootWidget
)

Ответ 6

Начиная с последней версии Flutters v1.7.8 + hotfix.2, вы можете скрыть клавиатуру, используя unfocus() вместо requestfocus()

FocusScope.of(context).unfocus()

поэтому всякий раз, когда вы нажимаете на клавиатуре части тела становится скрытым

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text("Login"),
      ),
      body: GestureDetector(
        onTap: () {
          FocusScope.of(context).unfocus();
        },
        child: Container(...)
      ),
    );
  }

Ответ 7

onPressed: () {
    FocusScope.of(context).unfocus();
},

Это работает для меня.