目前,我知道使用此代码隐藏软键盘的方法,可以通过任何小部件的onTap
方法实现。
FocusScope.of(context).requestFocus(new FocusNode());
我想通过在TextField之外的任何地方点击或屏幕上的任何位置来隐藏软键盘。 在Flutter中是否有任何方法可以实现这一点?
但是,我希望通过在TextField之外的任何地方点击或屏幕上的任何位置来隐藏软键盘。 Flutter中是否有任何方法可以实现这一点?
目前,我知道使用此代码隐藏软键盘的方法,可以通过任何小部件的onTap
方法实现。
FocusScope.of(context).requestFocus(new FocusNode());
我想通过在TextField之外的任何地方点击或屏幕上的任何位置来隐藏软键盘。 在Flutter中是否有任何方法可以实现这一点?
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
),
),
)
更新(2021年5月)
return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: Scaffold(
appBar: AppBar(
title: Text('Login'),
),
body: Body(),
),
);
即使您触摸AppBar,这也能正常工作,new
在Dart 2中是可选的。 FocusManager.instance.primaryFocus
将返回当前在小部件树中具有主要焦点的节点。
behavior: HitTestBehavior.translucent,
参数时才能确保 onTap
回调函数总是被触发。在没有这个参数的情况下,我发现某些轻击并不能正常工作。 - AndrewSonTapDown: (_) => FocusManager.instance.primaryFocus?.unfocus()
- Hardik从2019年5月开始,FocusNode
现在有一个unfocus
方法:
取消所有对焦的请求。
无论这个节点是否曾经请求过焦点,这种方法都是安全的。
如果为您的文本字段声明了FocusNode
,请使用unfocus
。
final focusNode = FocusNode();
// ...
focusNode.unfocus();
我的原始回答建议使用detach
方法-只有在您需要完全摆脱您的FocusNode
时才使用。如果您打算继续使用它-请改用unfocus
。
如果您没有明确声明FocusNode
,则针对当前上下文的FocusScope
请使用unfocus
。
FocusScope.of(context).unfocus();
< hr />
请查看原回答的修订历史。
ListView(
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
children: [],
)
TapRegion(
onTapOutside: (event) => FocusScope.of(context).unfocus(),
child: // your sub-tree that triggered the keyboard
)
我找到了最简单的方法,
现在你可以在TextField小部件中使用onTapOutside
。
TextField(
onTapOutside: (event) {
print('onTapOutside');
FocusManager.instance.primaryFocus?.unfocus();
},)
GestureDetector
包装起来。new Scaffold(
body: new GestureDetector(
onTap: () {
// call this method here to hide soft keyboard
FocusScope.of(context).requestFocus(new FocusNode());
},
child: new Container(
-
-
-
)
)
FocusNode
可能会导致内存泄漏... - SePröbläm我添加了这行文字
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'),
),
)
);
}
excludeFromSemantics: true
以确保辅助技术不会将整个屏幕视为单个可点击块。 - Isaac Lyman从Flutter最新版本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(...)
),
);
}
如果您有复杂的屏幕,请使用Listener
代替。我之前遇到了这个问题:
在`GestureDetector`中捕获事件时出现延迟/滞后,原因是什么?
文档中提到:
与其监听原始指针事件,不如使用GestureDetector监听更高级别的手势。
GestureDetector
监听高级手势。我认为这导致了一些延迟或滞后。
我的解决方法:
Listener(
behavior: HitTestBehavior.opaque,
onPointerDown: (_) {
FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold()
当您点击任何地方时,将触发此事件。
如果您希望在应用的任何屏幕上都能访问该行为,请使用GestureDetector包裹MaterialApp:
// main.dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
}
},
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
),
);
}
}
检查hasPrimaryFocus是否为true是必要的,以防止Flutter在尝试取消聚焦树顶部节点时抛出异常。
(原始内容由Flutter Igniter博客的James Dixon提供)
onPanDown
而不是onTap
,或者尝试其他手势。 - alireza easazadeonPressed: () {
FocusScope.of(context).unfocus();
},