检测点击android后退按钮以关闭键盘

Posted

技术标签:

【中文标题】检测点击android后退按钮以关闭键盘【英文标题】:Detect tapping the android back button to close the keyboard in flutter 【发布时间】:2020-07-29 11:08:10 【问题描述】:

我正在寻找一种可能性来检测用户何时点击底部的 android 后退按钮以关闭键盘。 问题如下:如果用户点击一个文本字段,它会获得焦点并出现键盘,这里一切都很好。我将文本字段放在 GestureDetector 中,因此如果用户点击文本字段之外的某个位置,则会调用 unfocus()。但在 android 上还有另一种关闭键盘的方法:使用底部智能手机的后退按钮。 有什么方法可以检测用户在键盘打开时点击它的时间?据我了解,WillPopScope 仅在后退按钮指向左侧时有效,但当键盘打开时,后退按钮指向底部,它还有另一个用途。 keyboard_visibility 包对我不起作用。向 KeyboardVisibilityNotification 添加监听器时,onHide 和 onChanged 方法没有触发。

【问题讨论】:

这是两个问题,你会找到答案如果你把问题分成两部分...... 我正在寻找一种方法来检测关闭键盘,方法是在颤动中点击 android 后退按钮,我补充说 KeyboardVisibility 包不起作用。不确定第二个问题是什么,但我希望现在很清楚。 @KönigWey 嗨,我正在努力实现同样的目标。你找到解决办法了吗? 嗨,是的,我使用了keyboard_visibility包,只是初始化了控制器final KeyboardVisibilityController _keyboardController = KeyboardVisibilityController();并在 initState() 中添加监听方法 onChange: _keyboardController.onChange.listen((bool isVisible) if (!isVisible && mounted) FocusScope.of(context).unfocus(); ); 乔尔的回答对我有用,你应该接受它以备将来参考! 【参考方案1】:

由于keyboard_visibility 包不再更新,您可以使用这个新包:Flutter Keyboard Visibility。它使用 null 安全性并正在获取更新。

这是我的方法,使用 FocusManager 而不是 FocusScope。

late final KeyboardVisibilityController _keyboardVisibilityController;
late StreamSubscription<bool> keyboardSubscription;

  @override
  void initState() 
    super.initState();
    _keyboardVisibilityController = KeyboardVisibilityController();
    keyboardSubscription = _keyboardVisibilityController.onChange.listen((isVisible) 
      if (!isVisible) FocusManager.instance.primaryFocus?.unfocus();
    );
  

  @override
  void dispose() 
    keyboardSubscription.cancel();
    super.dispose();
  

请参阅package 了解替代实现。

【讨论】:

这可能会导致错误,尤其是。如果您必须调用 setState onChange ,因为您的示例未显示如何正确取消 StreamSubscription 并处置它。我建议进行修改。【参考方案2】:

使用keyboard_visibility 包:https://pub.dev/packages/keyboard_visibility。

onHide 回调由于某种原因没有触发,因此您必须改用 onChange 并检查可见性是否为 false。

【讨论】:

【参考方案3】:
  @override
  Widget build(BuildContext context) 
   return WillPopScope(
         child: Scaffold(.....),
          onWillPop: () async 
            var currentFocus = FocusScope.of(context);
            if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) 
              currentFocus.focusedChild.unfocus();
              return false;
            else
              return true;
            
          ,
        );
    

使用 WillPopScope 在按下事件时关闭键盘

【讨论】:

onWillPop 仅在您尝试弹出路由时才调用,这里不是这种情况。点击android按钮(向下箭头)关闭键盘与路由无关,它只是关闭键盘

以上是关于检测点击android后退按钮以关闭键盘的主要内容,如果未能解决你的问题,请参考以下文章

如何在主页中打开后退按钮 android 以退出应用程序并关闭反应本机导航侧菜单

检测页面来自后退按钮的方法

如何处理后退按钮android以退出应用程序并在首页中打开时关闭本机导航侧菜单

Android:为EditText打开键盘时处理后退按钮单击

在后退按钮点击完成编辑 UITextField

如何为Android应用程序统一访问手机后退按钮