【问题标题】: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,所以会有很多重复的代码

【问题讨论】:

    标签: flutter dart


    【解决方案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 时,此解决方案将创建异常

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      相关资源
      最近更新 更多