Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何关闭屏幕上的键盘?_Dart_Flutter - Fatal编程技术网

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,