作者:小新亚笔 | 来源:互联网 | 2022-12-08 19:27
目前我知道使用此代码隐藏软键盘的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> George..:
更新
从2019年5月上旬开始,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仅会创建一个新的无用的对象,该对象会一直悬在用户使用'real'敲击文本字段之前FocusNode
。
如果您正在寻找一种“正确”的方法来1)消除键盘2)取消焦点文本字段-我可能已经找到了正确的方法:
FocusScope.of(context).detach();
官方文档说,detach
即使没有焦点,也可以安全使用。
但是,如果您只想隐藏键盘而不丢失文本字段焦点(出于某种原因),则可以尝试以下操作:
import 'package:flutter/services.dart' show SystemChannels;
SystemChannels.textInput.invokeMethod('TextInput.hide');
4> atereshkov..:
我已经添加了这一行
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'),
),
)
);
}