如何在没有焦点的情况下完全取消焦点 TextField 稍后回来

How to fully unfocus TextField in flutter without focus coming back later

在我的 flutter 应用程序中,我有一个文本字段,我希望能够通过点击一个不可交互的组件来移除焦点。这不是 flutter 中文本字段的默认行为,因此我需要找到一种方法来手动执行此操作。我已经按照 https://flutterigniter.com/dismiss-keyboard-form-lose-focus/ 和其他各种页面上的步骤进行了一些工作,其中涉及根部的 GestureDetector 和看起来像这样的 onTap:

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

问题是,当我 select 文本字段单击其他地方(此时焦点似乎消失),打开时间选择器,然后关闭该时间选择器时,文本字段再次获得焦点。如果我通过单击键盘上的“完成”按钮取消对文本字段的关注,那么 opening/closing 时间选择器将不会重新关注文本字段,所以我知道这一定是我取消关注的方式有问题.什么是正确的分散注意力的方法,这样焦点就不会像那样回来了?

将整个屏幕包裹到 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');
   }

我明白了,看来我需要在根的 GestureDetector 中使用 onTap: () => FocusManager.instance.primaryFocus.unfocus()。我很确定这是解决这个特定问题的最佳方法,但我不确定它是否会导致副作用。

无需调用 unfocus 方法对我有用的是,我告诉 TextField 本身不要自行请求焦点。 在文本字段中,我添加了:

focusNode: FocusNode(canRequestFocus: false),

我认为这是处理该问题的正确方法。