如何在Flutter中防止返回按钮关闭键盘?

7
我希望设置键盘在聊天页面中始终打开,不能通过返回按钮关闭。
WillPopScope()小部件仅防止后退按钮导航回上一页,但仍会关闭键盘。 通过在textformfield中设置autofocus = true,我初始打开了键盘,所以我面临的唯一问题是防止键盘关闭。
我在Stack中查看了多个问题,但未找到适合此问题的解决方案。 我已经搜索答案超过2个月了,希望有人能够帮助我解决这个问题。
更新:
我对我的heightofdevice进行了以下更改,减去了MediaQuery.of(context).viewInsets.bottom,现在键盘的转换更好了。
我意识到我之前尝试修复键盘并防止其被关闭的方法需要在Android的Java或Kotlin本地级别上进行太多的修复。 我最初想要修复键盘因为转换效果不佳,但是使用以下方法后,转换效果现在更好了,但仍有提高的空间。
var heightStatusBar = MediaQuery.of(context).padding.top;
var bottom = MediaQuery.of(context).viewInsets.bottom;
widthofdevice = MediaQuery.of(context).size.width;
heightofdevice =(MediaQuery.of(context).size.height) - 
heightStatusBar - bottom;

只有在小部件上有焦点(如TextField)时,您的键盘才能打开。 - Dani3le_
键盘可以打开,但问题是我需要防止通过手机的硬件返回按钮来关闭它。 - Paavanan Vellan
1个回答

0
问题在于当键盘打开并且用户按下Android返回按钮时,应用程序不会更改键盘的正确焦点,即使关闭键盘,焦点仍然保持为True... 因此,下一次点击文本字段以再次打开键盘时,焦点是真实的,Flutter检索到它已经打开并且不执行任何操作。
要解决这个问题,您可以使用GestureDetector包装TextField的点击,并使用组合Focus和viewInsets验证。
void _onFocus() {
    if (_focusNode.hasFocus && MediaQuery.of(context).viewInsets.bottom == 0) {
     _focusNode.unfocus();
     Future.delayed(const Duration(microseconds: 1), 
       () => _focusNode.requestFocus());
} else {
  _focusNode.requestFocus();
}
}

如果用户按下背叛键关闭键盘,然后再次点击文本字段打开键盘,那么MediaQuery.viewInsets中的验证将失败,并且它将更新焦点的实际状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接