Как скрыть мягкую клавиатуру ввода на флаттер после щелчка вне 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();
},
Это работает для меня.