如何在flutter中完全取消对TextField的聚焦,而稍后不会返回焦点



在我的flutter应用程序中,我有一个文本字段,我希望能够通过点击一个不可交互的组件来移除焦点。这不是flutter中文本字段的默认行为,所以我需要找到一种手动操作的方法https://flutterigniter.com/dismiss-keyboard-form-lose-focus/以及其他各种页面,其中包括一个位于根目录的手势检测器和一个看起来像这样的onTap:

onTap: () {
FocusScopeNode cf = FocusScope.of(context);
if (!cf.hasPrimaryFocus && cf.focusedChild != null) {
cf.focusedChild.unfocus();
cf.unfocus();
}
}

问题是,当我选择文本字段,单击其他地方(此时焦点似乎消失了(,打开一个时间选择器,然后关闭该时间选择器时,文本字段会再次聚焦。如果我通过点击";完成";按钮,然后打开/关闭时间选择器不会重新聚焦文本字段,所以我知道我取消聚焦的方式一定有问题。取消聚焦的正确方式是什么,这样焦点就不会像那样回来了?

我想好了,看起来我需要在根的GestureDetector中使用onTap: () => FocusManager.instance.primaryFocus.unfocus()。我很确定这是解决这个特殊问题的最佳方案,尽管我不确定它是否会引起副作用。

将整个屏幕包装到GestureDetector有两种方法可以关闭键盘\

  1. FocusScope.of(context).requestFocus(FocusNode());
import 'package:flutter/services.dart';
SystemChannels.textInput.invokeMethod('TextInput.hide');

所以请试着用这个编码

import 'package:flutter/services.dart';
onTap(){
SystemChannels.textInput.invokeMethod('TextInput.hide');
}

在不需要调用unfocus方法的情况下,我告诉TextField本身不要请求关注它自己。在文本字段中,我添加了:

focusNode: FocusNode(canRequestFocus: false),

我相信这是正确的处理方式。

相关内容

最新更新