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

标签 flutter dart textfield

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 调用它?

最佳答案

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

 GestureDetector(

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

    if (!currentFocus.hasPrimaryFocus) {
      currentFocus.unfocus();
    }
  },
   child:...
 ),
归功于 this guy.

关于flutter - 如何在 Flutter 中的文本(表单)字段中从 `FocusNode` 移除焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61236993/

相关文章:

flutter - Dart 如何通过键过滤 map

javascript - 扩展文本字段宽度以适应键入时的输入

javascript - 使用 Javascript 清除文本框和单选按钮 onclick

reactjs - 如何将 material-ui TextField 设置为仅接受十六进制字符

带有两个大按钮的 Flutter View

dart - 底部带有滚动页脚的 ListView

flutter - 为Flutter项目创建DART包时出错

flutter - 在 AlertDialog 中获取复选框

flutter - Flutter在函数中调用不同类型

xml - 解析xml并按属性获取