Android 释放TextFormField聚焦于硬件后退按钮按下
我在颤振应用程序中有一个Android 释放TextFormField聚焦于硬件后退按钮按下,android,flutter,dart,Android,Flutter,Dart,我在颤振应用程序中有一个TextFormField,它的焦点对我的屏幕功能很重要。当字段有焦点时,我会在页面上隐藏一些小部件,以便在键盘打开时看起来很好 当我按下后退按钮退出字段时,键盘最小化,但字段仍保持焦点。所以我在屏幕上隐藏的小部件仍然是隐藏的。当我点击离开焦点时,小部件就会回来,但我知道用户会对为什么“后退”按钮没有使小部件重新出现感到困惑。我知道我可以通过请求新焦点来释放焦点: FocusScope.of(context.requestFocus(FocusNode()); 但是,我
TextFormField
,它的焦点对我的屏幕功能很重要。当字段有焦点时,我会在页面上隐藏一些小部件,以便在键盘打开时看起来很好
当我按下后退按钮退出字段时,键盘最小化,但字段仍保持焦点。所以我在屏幕上隐藏的小部件仍然是隐藏的。当我点击离开焦点时,小部件就会回来,但我知道用户会对为什么“后退”按钮没有使小部件重新出现感到困惑。我知道我可以通过请求新焦点来释放焦点:
FocusScope.of(context.requestFocus(FocusNode());
但是,我不知道在哪里可以调用这个发布焦点逻辑。我想我可能能够创建一个EventChannel
来订阅本机活动onBackButtonPressed()
,并沿频道发送回按钮事件,但它看起来像一个
我知道有一个WillPopScope
小部件,如果它将退出当前的ModalRoute
,则允许您捕获后退按钮事件,但我不确定是否可以使用它来解决我的问题,因为感兴趣的小部件是TextFormField
而不是ModalRoute
有什么办法可以订阅键盘关闭事件吗?当我把问题打到最后时,我想到了订阅键盘关闭事件的想法。。。果然有一个包装 因此,我可以通过使用
键盘可见性
包来解决我的问题
import'package:keyboard_visibility/keyboard_visibility.dart';
// ...
final FocusNode roomIdInputFocusNode=FocusNode();
final roomIdHasFocus=行为主体();
// ...
roomIdHasFocus.sink.add(false);
roomIdInputFocusNode.addListener(){
roomIdHasFocus.sink.add(roomIdInputFocusNode.hasFocus);
});
KeyboardVisibilityNotification().addNewListener(
onChange:(bool可见){
如果(!可见){
roomIdHasFocus.sink.add(false);
}else if(可见和&roomIdInputFocusNode.hasFocus){
roomIdHasFocus.sink.add(true);
}
},
);
不幸的是,这仍然保持了对TextFormField的关注,但对我来说已经足够好了,因为我可以在键盘打开时取消隐藏隐藏的小部件。首先,为什么要在显示键盘时隐藏小部件,然后在处理完后再显示?看起来您正试图以一种不优雅的方式防止溢出。如果是这样,您不需要所有这些工作,只需将您的视图包装在
SingleChildScrollView
中即可,如果没有足够的空间,键盘就会出现,内容可以滚动。我的屏幕有两个用户流选项:扫描二维码或输入pin码。当用户关注pin码输入时,这是我页面上唯一与他们相关的内容。他们不需要滚动查看其他内容,因为只需要填写聚焦文本字段,他们就可以继续前进。