如何在 flutter 中完全取消 TextField 焦点而不稍后焦点返回

Lio*_*oft 9 android focus textfield 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Lio*_*oft 19

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

  • unfocus 对我有用,但只有当没有其他东西捕捉到点击时,GestureDetector 才会捕捉到它。因此屏幕上的任何其他按钮也必须调用取消焦点。 (3认同)

Abh*_*ata 9

将整个屏幕包裹起来GestureDetector 有两种方法可以关闭键盘\

  1. FocusScope.of(context).requestFocus(FocusNode());
import 'package:flutter/services.dart';

SystemChannels.textInput.invokeMethod('TextInput.hide');
Run Code Online (Sandbox Code Playgroud)

所以请尝试用这个编码

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