android - 释放 TextFormField 关注硬件后退按钮按下

标签 android flutter dart

我有一个 TextFormField在一个 flutter 的应用程序中,它的焦点对我的屏幕功能很重要。当该字段具有焦点时,我会在页面上隐藏一些小部件,以便在键盘打开时看起来不错。

当我按下后退按钮退出该字段时,键盘被最小化,但该字段仍然保持焦点。所以我隐藏在屏幕上的小部件仍然是隐藏的。一旦我失去焦点,小部件就会回来,但我知道用户会对为什么后退按钮没有使小部件重新出现感到困惑。我知道我可以通过请求新焦点来释放焦点:

FocusScope.of(context).requestFocus(FocusNode());

但是,我不知道在哪里可以调用此发布焦点逻辑。我以为我可以创建一个 EventChannel订阅原生 Activity onBackButtonPressed()并将按钮事件发送回 channel ,但它看起来像 open issue to be able to override this function in a Flutter app .

我知道有一个WillPopScope如果它将退出当前 ModalRoute,则允许您捕获返回按钮事件的小部件,但我不确定是否可以使用它来解决我的问题,因为感兴趣的小部件是 TextFormField不是 ModalRoute .

有没有办法我可以订阅键盘关闭?

最佳答案

当我写完我的问题时,我想到了订阅键盘关闭事件的想法......果然有一个包! https://pub.dev/packages/keyboard_visibility

所以,我可以使用 keyboard_visibility 来解决我的问题。包裹

import 'package:keyboard_visibility/keyboard_visibility.dart';
// ...
final FocusNode roomIdInputFocusNode = FocusNode();
final roomIdHasFocus = BehaviorSubject<bool>();
// ...
roomIdHasFocus.sink.add(false);
roomIdInputFocusNode.addListener(() {
    roomIdHasFocus.sink.add(roomIdInputFocusNode.hasFocus);
});
KeyboardVisibilityNotification().addNewListener(
    onChange: (bool visible) {
        if (!visible) {
            roomIdHasFocus.sink.add(false);
        } else if (visible && roomIdInputFocusNode.hasFocus) {
            roomIdHasFocus.sink.add(true);
        }
    },
);

不幸的是,这仍然将焦点放在 TextFormField 上,但这对我来说已经足够了,因为我能够在打开键盘时取消隐藏我隐藏的小部件。

关于android - 释放 TextFormField 关注硬件后退按钮按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775785/

相关文章:

android - 如何使用 ionic-cli 使用 Crosswalk lite 构建 android?

flutter - Flutter-SVG文件的笔触变得更细

flutter - 为GridView中的其他所有项目增加值(value)

android - Flutter:未找到 SDK 位置。使用 local.properties 文件中的 sdk.dir 或使用 ANDROID_HOME 环境变量定义位置

android - "NoSuchMethodError: The method ' [] ' was called on null."我的流中出现错误

dart - 使用单选按钮和 Web UI 进行数据绑定(bind)

android - 将 SharedPreferences 用作磁盘缓存是一种好习惯吗?

android - 在 webview 中使用 javascript 加载 html

node.js - 如何从 Flutter 发出纯文本 http(而非 https)请求

java - 是否可以创建 ByteArrays 的 ByteArray 作为 kotlin 中的元素?