Dart 如何关闭屏幕上的键盘?
我正在使用Dart 如何关闭屏幕上的键盘?,dart,flutter,Dart,Flutter,我正在使用TextFormField收集用户输入,当用户按下floatingAction按钮表示已完成时,我想关闭屏幕键盘 如何使键盘自动消失 import 'package:flutter/material.dart'; class MyHomePage extends StatefulWidget { MyHomePageState createState() => new MyHomePageState(); } class MyHomePageState extends S
TextFormField
收集用户输入,当用户按下floatingAction按钮
表示已完成时,我想关闭屏幕键盘
如何使键盘自动消失
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
MyHomePageState createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
TextEditingController _controller = new TextEditingController();
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.send),
onPressed: () {
setState(() {
// send message
// dismiss on screen keyboard here
_controller.clear();
});
},
),
body: new Container(
alignment: FractionalOffset.center,
padding: new EdgeInsets.all(20.0),
child: new TextFormField(
controller: _controller,
decoration: new InputDecoration(labelText: 'Example Text'),
),
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
void main() {
runApp(new MyApp());
}
导入“包装:颤振/材料.省道”;
类MyHomePage扩展StatefulWidget{
MyHomePageState createState()=>新建MyHomePageState();
}
类MyHomePageState扩展了状态{
TextEditingController _controller=新的TextEditingController();
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(),
floatingActionButton:新的floatingActionButton(
子:新图标(Icons.send),
已按下:(){
设置状态(){
//发送消息
//请在屏幕键盘上单击此处
_controller.clear();
});
},
),
主体:新容器(
对齐:分馏loffset.center,
填充:新边缘设置。全部(20.0),
子项:新建TextFormField(
控制器:_控制器,
装饰:新输入装饰(labelText:“示例文本”),
),
),
);
}
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
void main(){
runApp(新的MyApp());
}
注意:这个答案已经过时了
您可以通过移除TextFormField
的焦点并将其交给未使用的FocusNode
来关闭键盘:
FocusScope.of(context).requestFocus(FocusNode());
使用聚焦镜的解决方案对我不起作用。 我发现了另一个:
import 'package:flutter/services.dart';
SystemChannels.textInput.invokeMethod('TextInput.hide');
它解决了我的问题。以上所有解决方案都不适合我 弗利特表示: 将您的小部件放入new GestureDetector()中,点击该小部件将隐藏键盘和onTap使用FocusScope.of(context.requestFocus)(new FocusNode()) 您可以使用
FocusNode
类中的unfocus()
方法
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
MyHomePageState createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
TextEditingController _controller = new TextEditingController();
FocusNode _focusNode = new FocusNode(); //1 - declare and initialize variable
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.send),
onPressed: () {
_focusNode.unfocus(); //3 - call this method here
},
),
body: new Container(
alignment: FractionalOffset.center,
padding: new EdgeInsets.all(20.0),
child: new TextFormField(
controller: _controller,
focusNode: _focusNode, //2 - assign it to your TextFormField
decoration: new InputDecoration(labelText: 'Example Text'),
),
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
void main() {
runApp(new MyApp());
}
导入“包装:颤振/材料.省道”;
类MyHomePage扩展StatefulWidget{
MyHomePageState createState()=>新建MyHomePageState();
}
类MyHomePageState扩展了状态{
TextEditingController _controller=新的TextEditingController();
FocusNode _FocusNode=new FocusNode();//1-声明并初始化变量
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(),
floatingActionButton:新的floatingActionButton(
子:新图标(Icons.send),
已按下:(){
_focusNode.unfocus();//3-在此处调用此方法
},
),
主体:新容器(
对齐:分馏loffset.center,
填充:新边缘设置。全部(20.0),
子项:新建TextFormField(
控制器:_控制器,
focusNode:_focusNode,//2-将其分配给TextFormField
装饰:新输入装饰(labelText:“示例文本”),
),
),
);
}
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
void main(){
runApp(新的MyApp());
}
正如在flatter中一样,一切都是一个小部件,我决定包装SystemChannels.textInput.invokeMethod('textInput.hide')
和(context.requestFocus)的FocusScope.of(FocusNode())代码>方法在一个简短的实用程序模块中,其中包含一个小部件和一个mixin
使用该小部件,您可以使用KeyboardHider
小部件包装任何小部件(使用良好的IDE支持时非常方便):
class SimpleWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return KeyboardHider(
/* Here comes a widget tree that eventually opens the keyboard,
* but the widget that opened the keyboard doesn't necessarily
* takes care of hiding it, so we wrap everything in a
* KeyboardHider widget */
child: Container(),
);
}
}
使用mixin,您可以在任何交互时触发隐藏键盘,使其不受任何状态或小部件的影响:
class SimpleWidget extends StatefulWidget {
@override
_SimpleWidgetState createState() => _SimpleWidgetState();
}
class _SimpleWidgetState extends State<SimpleWidget> with KeyboardHiderMixin {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
// Hide the keyboard:
hideKeyboard();
// Do other stuff, for example:
// Update the state, make an HTTP request, ...
},
);
}
}
下面的代码帮助我隐藏键盘
void initState() {
SystemChannels.textInput.invokeMethod('TextInput.hide');
super.initState();
}
从Flatter v1.7.8+修补程序2开始,我们要走的路是:
FocusScope.of(context).unfocus()
关于这一点:
既然#31909(be75fb3)已经着陆,您应该使用
FocusScope.of(context).unfocus()
代替
FocusScope.of(context).requestFocus(FocusNode())
,因为FocusNode
s是
更改通知程序
,应正确处理
->不要使用,r,e,q,u,e,s,t,F,o,c,u,s(
)
F̶o̶c̶u̶s̶S̶c̶o̶p̶e̶.̶o̶f̶(̶c̶o̶n̶t̶e̶x̶t̶)̶.̶r̶e̶q̶u̶e̶s̶t̶F̶o̶c̶u̶s̶(̶F̶o̶c̶u̶s̶N̶o̶d̶e̶(̶)̶)̶;̶
\u解释器键盘(构建上下文){
FocusScope.of(context).requestFocus(newfocusnode());
}
@凌驾
小部件构建(构建上下文){
返回新的手势检测器(
onTap:(){
这是键盘(上下文);
},
子容器:新容器(
颜色:颜色,白色,
子:新列(
儿童:[/*…*/],
),
),
);
}
滚动列表时自动隐藏键盘的.unfocus()的示例实现
FocusScope.of(context).unfocus();
你可以在
多亏了索普
GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child:Container(
alignment: FractionalOffset.center,
padding: new EdgeInsets.all(20.0),
child: new TextFormField(
controller: _controller,
decoration: new InputDecoration(labelText: 'Example Text'),
),
), })
尝试一下这个点击手势对于不同的版本,看起来有不同的方法。我使用的是颤振v1.17.1,下面的内容对我很有用
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
currentFocus.focusedChild.unfocus();
}
}
尝试使用文本编辑控制器。
一开始
final myController = TextEditingController();
@override
void dispose() {
// Clean up the controller when the widget is disposed.
myController.dispose();
super.dispose();
}
在新闻发布会上
onPressed: () {
commentController.clear();}
这将关闭keybord。对于颤振1.17.3(截至2020年6月的稳定通道),使用
总之,这是颤振1.17的有效解决方案:
像这样包装您的小部件:
GestureDetector(
onTap: FocusScope.of(context).unfocus,
child: YourWidget(),
);
要关闭键盘(1.7.8+修补程序2及更高版本),只需调用以下方法:
FocusScope.of(context).unfocus();
一旦FocusScope.of(context).unfocus()方法在关闭键盘之前已经检查了是否有焦点,就不需要检查它了。但如果需要,只需调用另一个context方法:FocusScope.of(context).hasPrimaryFocus
您还可以为textfield声明一个focusNode,完成后,您可以在该focusNode上调用unfocus方法
并对其进行处理
类MyHomePage扩展StatefulWidget{
MyHomePageState createState()=>新建MyHomePageState();
}
类MyHomePageState扩展了状态{
文本编辑
onPressed: () {
commentController.clear();}
FocusManager.instance.primaryFocus.unfocus();
GestureDetector(
onTap: FocusScope.of(context).unfocus,
child: YourWidget(),
);
FocusScope.of(context).unfocus();
Listener(
onPointerUp: (_) {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
currentFocus.focusedChild.unfocus();
}
},
child: MaterialApp(
title: 'Flutter Test App',
theme: theme,
...
),
)
if(FocusScope.of(context).isFirstFocus) {
FocusScope.of(context).requestFocus(new FocusNode());
}
Focus.of(context).unfocus();
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,