dart 未检测到键盘,MediaQuery.of(context).viewInsets.bottom始终返回0.0

2mbi3lxu  于 2023-09-28  发布在  其他
关注(0)|答案(9)|浏览(204)

我有一个scaffold,里面有一个TextField。当键盘以前将字段移动到键盘上方时,键盘总是覆盖该字段。我的项目中的所有页面都发生了这种情况。
我在构建方法中添加了MediaQuery.of(context).viewInsets.bottom,它总是返回0.0。当键盘出现时,没有重建。我已经尝试设置resizeToAvoidBottomInset为true和false,没有任何变化。我试着把它 Package 在一个可滚动的小部件,没有变化。
iOS中一切正常,这只影响Android版本。

Doctor summary (to see all details, run flutter doctor -v):  
[✓] Flutter (Channel unknown, v1.10.15, on Mac OS X 10.15.1 19B88, locale en-US)  

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)  
[✓] Xcode - develop for iOS and macOS (Xcode 11.2.1)  
[✓] Android Studio  
[✓] Android Studio (version 3.5)  
[✓] VS Code (version 1.40.2)  
[✓] Connected device (1 available)
5f0d552i

5f0d552i1#

我最近遇到了这个问题。您是否已将全屏设置为true?如果启用了全屏,MediaQuery.viewInsets.bottom将返回0.0。既然你提到的问题只发生在Android,它可能是你设置的全屏属性在原生的Android文件.检查styles.xml

<item name="android:windowFullscreen">false</item>

从应用程序中删除全屏的另一种方法是flutter page中的SystemChrome.setEnabledSystemUIOverlays([])
您可能还需要检查的一件事是在Scaffold中将resizeToAvoidBottomPadding:设置为false。
在Flutter问题中也提出了这个问题:https://github.com/flutter/flutter/issues/25050

l5tcr1uw

l5tcr1uw2#

我找到了这个问题的原因,但我不知道为什么。当控件处于Scaffold中时,键盘的出现和消失将不会在Scaffold中重建主体。您可以尝试将Scaffold替换为Material进行观察。如果你不想更换脚手架,我可以找到一个方法:

final bottom= EdgeInsets.fromWindowPadding(
    WidgetsBinding.instance.window.viewInsets,
    WidgetsBinding.instance.window.devicePixelRatio).bottom;
brccelvz

brccelvz3#

查看是否在MaterialApp中将useInheritedMediaQuery设置为true。如果是,则将其设置为false。这是因为该属性强制小部件使用继承的上下文。例如,如果你在应用程序启动时立即弹出键盘,MediaQuery.of(context).viewInsets.bottom的值与键盘的大小相同,但由于该上下文现在适用于儿童,因此它永远不会改变,即使键盘折叠。所以,当我面对这个问题时,我的简单解决方案是将useInheritedMediaQuery设置为false,这是这些天flutter应用程序的默认设置。

jgovgodb

jgovgodb4#

在复杂的小部件树MediaQuery.of(context). viewInsets.bottom的情况下,即使键盘打开,也会显示null。所以,我们必须沿着树向下改变值。
这个软件包提供了简单易用的提供程序,用于从树中获取信息https://pub.dev/packages/flutter_keyboard_size
或者,你可以自己在树中改变键盘大小的信息(你可以在包中查看代码)。

ubby3x7f

ubby3x7f5#

当键盘打开时,MediaQuery.of(context).viewInsets.bottom会发生更改以反映新的底部(现在位于键盘的顶部)。
但是,Android应用程序可能处于全屏状态:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:windowFullscreen">true</item>
    </style>
    <color name="xxx">#FFFF00</color>
</resources>

在这种情况下,viewInsets.bottom将始终是0.0,即使键盘打开,

z9ju0rcb

z9ju0rcb6#

为托管Flutter屏幕in AndroidManifest.xml的Activity设置android:windowSoftInputMode="adjustResize"将修复此问题。

lg40wkob

lg40wkob7#

我需要混合flutter和Android,情况可能会更复杂,<item name="android:windowFullscreen">false</item>SystemChrome.setEnabledSystemUIOverlays([])不适合我。
最后,AndroidManifest.xml中的设置android:windowSoftInputMode="adjustResize"对我来说很有效。

ckocjqey

ckocjqey8#

尝试MediaQuery.of(context).viewInsets.bottom与scaffold上下文,而不是子窗口小部件。
对我很有效

uajslkp6

uajslkp69#

我还没有看到我的解决方案,所以在这里发布。
听起来很奇怪,我使用了以下代码:

final keyboardHeight = MediaQuery.of(Scaffold.of(context).context).viewInsets.bottom;

解决方案来自Github上的这条评论。
在我的例子中,我使用了SingleChildScrollViewRow的第一个例子,而不是Column
一旦选择了TextFieldRow中的每个Column都没有正确的高度,因此我需要在LayoutBuilder中执行constraints.maxHeight + keyboardHeight以获得正确的高度,无论键盘是否显示。

相关问题