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

时间:2019-12-05 14:45:00

标签: android flutter dart flutter-layout

我有一个带有TextField的脚手架。以前,键盘会将字段移到键盘上方时,它始终会覆盖该字段。这发生在我项目的所有页面上。

我已经将MediaQuery.of(context).viewInsets.bottom添加到我的构建方法中,并且始终返回0.0。键盘抬起时,不会重建。我尝试将resizeToAvoidBottomInset设置为true和false,而没有进行任何更改。我尝试将其包装在Scrollable小部件中,保持不变。

在IOS上一切正常,这只会影响android构建。

overall.drop('YTD2017',axis=1,level = 1 ,inplace = True)

4 个答案:

答案 0 :(得分:2)

我最近遇到了这个问题。您是否将全屏设置为true?如果启用了全屏,MediaQuery.viewInsets.bottom将返回0.0。由于您提到的问题仅在android中发生,因此有可能在本机android文件中设置了全屏属性。检查styles.xml

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

从应用中删除全屏的另一种方法是在颤动页面中SystemChrome.setEnabledSystemUIOverlays([])

您可能还要检查的另一件事是resizeToAvoidBottomPadding:在脚手架中为假。

在Flutter问题中也提出了该问题:https://github.com/flutter/flutter/issues/25050

答案 1 :(得分:0)

在复杂的小部件树的情况下,即使键盘处于打开状态,MediaQuery.of(context).viewInsets.bottom仍为null。因此,我们必须在树上变异值。

此软件包提供了易于使用的提供程序,用于从树https://pub.dev/packages/flutter_keyboard_size处获取信息

或者,您可以自行改变有关键盘大小的信息(可以在包中查找代码)。

答案 2 :(得分:0)

打开键盘后,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

答案 3 :(得分:0)

我找到了这个问题的原因,但我不知道为什么。当控件在 Scaffold 中时,键盘的出现和消失不会在 Scaffold 中重建 body。可以尝试用Material代替Scaffold来观察。如果您不想更换 Scaffold,我能找到的一种方法是:

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