目前,我知道使用此代码隐藏软键盘的方法,可以通过任何小部件的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(FocusNode());
},
behavior: HitTestBehavior.translucent,
child: rootWidget
)
GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus &&
currentFocus.focusedChild != null) {
FocusManager.instance.primaryFocus.unfocus();
}
},
child: MaterialApp(
theme: ThemeData.dark().copyWith(
primaryColor: Color(0xFF0A0E21),
scaffoldBackgroundColor: Color(0xFF0A0E21),
),
home: LoginUI(),
),
);
child: Form(
child: Column(
children: [
TextFormField(
decoration: InputDecoration(
labelText: 'User Name', hintText: 'User Name'),
onTapOutside: (PointerDownEvent event) {
FocusScope.of(context).requestFocus(_unUsedFocusNode);
},
),
],
),
),
定义焦点节点。
FocusNode _unUsedFocusNode = FocusNode();
在TextFromField中重写onTapOutside方法
onTapOutside: (PointerDownEvent event) {
FocusScope.of(context).requestFocus(_unUsedFocusNode);
},
编辑:
Note: it will work in sdk Flutter 3.6.0-0.1.pre Dart SDK 2.19.0-374.1.beta
Listener(
onPointerDown: (_) {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.focusedChild.unfocus();
}
},
child: MaterialApp(...),
);
最适合我的。
我选择使用 Material App
因为它可以全局触摸外部。
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
FocusManager.instance.primaryFocus.unfocus();
}
以下是解决方法:
我只检查平台 iOS
,因为Android
可以通过返回按钮隐藏键盘。
Listener(
onPointerUp: (_) {
if (Platform.isIOS) {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus &&
currentFocus.focusedChild != null) {
FocusManager.instance.primaryFocus.unfocus();
}
}
},
child: MaterialApp(
debugShowCheckedModeBanner: true,
home: MyHomePage(),
...
),
),
很高兴你正在编写代码。
Flutter 版本
在Flutter 2.5中,GestureDetector.OnTap没有起作用。
只有以下方法可以使用:
return GestureDetector(
//keyboard pop-down
onTapDown: (_) => FocusManager.instance.primaryFocus?.unfocus(),
behavior: HitTestBehavior.translucent,
child: Scaffold(
现在您可以使用onTapOutside
了。
TextField(
onTapOutside: (b) {
FocusManager.instance.primaryFocus?.unfocus();
},
),
以下是适合初学者的简单解决方案,当用户点击屏幕上的任何区域时,您需要隐藏键盘。希望这能对您有所帮助。
步骤1:您需要在全局类中创建此方法,
此方法将主要小部件包装到GestureDetector中,因此当用户在文本字段之外点击时,它将自动隐藏键盘。
Widget hideKeyboardWhileTapOnScreen(BuildContext context, {MaterialApp child}){
return GestureDetector(
onTap: () {
if (Platform.isIOS) { //For iOS platform specific condition you can use as per requirement
SystemChannels.textInput.invokeMethod('TextInput.hide');
print("Keyboard Hide");
}
},
child: child,
);
}
这个方法将您的主widget包装成Listener,所以当用户触摸并向上滚动时,它会自动隐藏键盘。
Widget hideKeyboardWhileTapOnScreen(BuildContext context, {MaterialApp child}){
return Listener(
onPointerUp: (_) {
if (Platform.isIOS) {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus &&
currentFocus.focusedChild != null) {
FocusManager.instance.primaryFocus.unfocus();
print("Call keyboard listner call");
}
}
},
child: child,
);
}
步骤二:使用全局方法的方法如下
@override
Widget build(BuildContext context) {
return hideKeyboardWhileTapOnScreen(context,
child: MaterialApp(
debugShowCheckedModeBanner: false, home: Scaffold(body: setAppbar())),
);
}
Widget setAppbar2() {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(primarySwatch: Colors.orange),
home: Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(),
),
);
}
最简单的方法 - 只需在您的MaterialApp
的builder
方法中编写一些代码:
void main() {
runApp(const MyApp());
}
Widget build(BuildContext context) {
return MaterialApp(
home: const MyHomePage(),
builder: (context, child) {
// this is the key
return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: child,
);
},
);
}
然后在所有页面中都可以使用它。