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