在 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/