Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 释放TextFormField聚焦于硬件后退按钮按下_Android_Flutter_Dart - Fatal编程技术网

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码输入时,这是我页面上唯一与他们相关的内容。他们不需要滚动查看其他内容,因为只需要填写聚焦文本字段,他们就可以继续前进。