gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:04:53 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com