【问题标题】:How to remove focus from `FocusNode` in a Text(Form)Field in Flutter如何从 Flutter 中的 Text(Form)Field 中的“FocusNode”中移除焦点
【发布时间】:2020-04-15 19:25:00
【问题描述】:

TextFormField 中,您可以使用FocusScope.of(context).requestFocus(_focusNode) 请求焦点。但是,如何确保同一个焦点节点未获得焦点?

例如,在我的工作流程中,我希望 hintText 最初为 X,聚焦时为 Y,未聚焦时返回 X。但是,如果我使用像下面这样的常用方法,我将无法返回 X。

class TextFormFieldErrorOnLabel extends StatefulWidget {
  final String hintText;
  final String hintTextOnFocus;

  const NewTextFormField({
    this.hintText,
    this.hintTextOnFocus,
  }) : super(key: key);

  @override
  _NewTextFormFieldState createState() => _NewTextFormFieldState();
}

class _NewTextFormFieldState {
  final FocusNode _focusNode = FocusNode();

  void _requestFocus() {
    setState(() {
      FocusScope.of(context).requestFocus(_focusNode);
    });
  }

  @override
  Widget build(BuildContext context) {
    return TextFormField(
      onTap: _requestFocus,
      focusNode: _focusNode,
      decoration: InputDecoration(
        hintText: _focusNode.hasFocus ? widget.hintTextOnFocus : widget.hintText,
      )
    );
  }
}

某处是否有“requestUnfocus”方法?如果是这样,我将如何从TextFormField 调用它?

【问题讨论】:

  • FocusNode 类有一个unfocus 方法。现在挑战在哪里调用它。

标签: flutter dart textfield


【解决方案1】:

如果您想在点击不可点击的小部件时取消焦点 将GestureDetector 放在小部件树的顶部,在onTap 处理程序上用FocusScope.of(context) 获取当前FocusNode,然后检查当前FocusNode 是否有hasPrimaryFocus,如果没有,我们调用@当前节点上的 987654326@ 以移除焦点。如果你尝试 unfocus() 一个当前具有主要焦点的节点,Flutter 将抛出异常。 代码将如下所示:

 GestureDetector(

   onTap: () {
    FocusScopeNode currentFocus = FocusScope.of(context);

    if (!currentFocus.hasPrimaryFocus) {
      currentFocus.unfocus();
    }
  },
   child:...
 ),

感谢this guy.

【讨论】:

    【解决方案2】:

    我不知道这是否是最佳做法,但我所做的是调用

    FocusScope.of(context).requestFocus(null);
    

    确保没有节点被选中。

    【讨论】:

    • 这可能是一个有用的技巧。但是你怎么称呼它?在包含字段的屏幕中?但基于什么?您如何根据在先前聚焦的字段上的点击来调用某些内容?
    • 是的,这是个好问题。首先,我找到了一种更简洁的消除焦点的方法,它是FocusScope.clear(context)。接下来,我认为您需要用 GestureDetector 包裹整个Scaffold,如果您想要的话,请移除点击的焦点。
    • 我将很快调查另外两个小部件:FocusFocusManager
    • 像个有魅力的人一样工作!另一个 .unfocus() 不适用于我的情况!节省时间!
    【解决方案3】:

    我遇到了同样的问题,我所做的是我在其他地方(最好在子类的父类中)创建了 FocusNode 对象并将其作为变量传递,并将父小部件包装在 GestureDetector 和 onTap 调用中,

     onTap: (){
            focusNode.unfocus();
     }
    

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2016-11-19
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多