如何在 Flutter 中的文本(表单)字段中从“FocusNode”中移除焦点

Phi*_*aro 5 textfield dart flutter

在 a 中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,
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

 GestureDetector(

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

    if (!currentFocus.hasPrimaryFocus) {
      currentFocus.unfocus();
    }
  },
   child:...
 ),
Run Code Online (Sandbox Code Playgroud)

归功于这个家伙。


小智 2

我不知道这是否是最佳实践,但我所做的是打电话

FocusScope.of(context).requestFocus(null);
Run Code Online (Sandbox Code Playgroud)

以确保没有选择任何节点。