释放专注于硬件后退按钮按下的TextFormField

时间:2019-11-09 02:03:28

标签: android flutter dart

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

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

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

但是,我不知道在哪里可以调用此发布重点逻辑。我以为我可以创建一个EventChannel来订阅本机活动onBackButtonPressed()并向该通道发送回按钮事件,但是它看起来像一个open issue to be able to override this function in a Flutter app

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

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

1 个答案:

答案 0 :(得分:0)

当我结束问题输入的时候,我想到了订阅键盘关闭事件的主意……可以肯定的是有一个包装! 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上,但这对我来说已经足够了,因为我可以取消隐藏键盘打开时隐藏的小部件。