移除按下多个按钮的键盘焦点

Posted

技术标签:

【中文标题】移除按下多个按钮的键盘焦点【英文标题】:Removing keyboard focus on multiple buttons pressed 【发布时间】:2020-10-07 02:15:16 【问题描述】:

我试图在 textField 之外的任何地方点击时隐藏键盘。所以我用 GestureDetector 包裹了 Scaffold 并用 unfocused() 设置了 onTap。这很好用,但是当按下按钮时键盘仍然处于活动状态

  Widget build(BuildContext context) 
    return GestureDetector(
      onTap: () => FocusScope.of(context).unfocus(),
      child: Scaffold(
        appBar: AppBar(
          actions: <Widget>[FlatButton(child: Text('Done'), onPressed: () )],
        ),
        body: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            FlatButton(
              child: Text('something'),
              onPressed: () ,
            ),
            TextField(),
          ],
        ),
      ),
    );
  

有没有什么方法可以移除焦点而不在所有按钮的 onTap 中添加不聚焦的按钮。原因是我那里有很多按钮,有些甚至设置了 onLogTap,所以会有很多重复的代码

【问题讨论】:

【参考方案1】:

您还需要在FlatButtononPressed() 方法中添加隐藏键盘的代码

FlatButton(
    child: Text('something'),
    onPressed: () 
    FocusScope.of(context).unfocus();
   ,   
),

希望有一些解决方案,我不需要这么多重复的代码来做一件事。

这是不可能的,因为GestureDetector 小部件的点击事件和FlatButton 的点击事件都不同,

您正在注册FlatButton 的不同/单独点击事件,这就是为什么当您点击FlatButton 时您的键盘没有隐藏的原因

现在按下按钮时键盘不隐藏的原因

因为GestureDetector 小部件的点击事件如果被FlatButton 的点击事件覆盖

解决方案

你可以做一件事,创建一个通用方法来隐藏键盘,然后调用该方法来从按钮单击

【讨论】:

嗯,这是我试图避免的。正如我在问题中提到的那样,我的屏幕上有很多按钮,每个按钮都做不同的事情。我希望有一些解决方案,我不需要这么多重复的代码来做一件事。我仍然赞成你的回答 was hoping for some solution where I wouldn't need so many duplicate codes to do one thing. AFAIK 这是不可能的,因为GestureDetector 小部件的点击事件和FlatButton 的点击事件是不同的你可以做一件事,创建一个隐藏键盘的通用方法,并调用该方法从按钮单击 是的,我有点害怕......创建方法会使该方法被多次调用,这又是同样的问题......我会等待可能有其他技巧的人如果没有(我不这么认为),那么我会将您的答案标记为已回答【参考方案2】:

通过跳出框框思考,我设法通过修改 GestureDetector.. 隐藏了所有水龙头上的键盘。

  Widget build(BuildContext context) 
    return GestureDetector(
      onPanDown: (pd) FocusScope.of(context).unfocus();, //<- replaced
      child: Scaffold(
        appBar: AppBar(
          actions: <Widget>[FlatButton(child: Text('Done'), onPressed: () )],
        ),
        body: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            FlatButton(
              child: Text('something'),
              onPressed: () ,
            ),
            TextField(),
          ],
        ),
      ),
    );
  

现在键盘将隐藏在 TextField 之外的任何地方,即使在按钮单击时也是如此。无需在每次按钮单击时隐藏它。如果您知道更好的解决方案,请告诉我

更新: 当点击已聚焦的 TextField 时,此解决方案将创建异常

【讨论】:

以上是关于移除按下多个按钮的键盘焦点的主要内容,如果未能解决你的问题,请参考以下文章

按下按钮和文本字段切换后 UITextField 失去焦点(键盘保持可见)

移动 Safari - 使用 Javascript 关闭键盘

奇怪的列表视图项目选择器外观(手指离开屏幕时未移除按下状态)

Android:捕捉按下键盘输入按钮的动作

安卓onKeyDown事件 重新获取焦点

软键盘仅在 EditText 焦点上显示一次