【问题标题】:Keyboard not being detected. MediaQuery.of(context).viewInsets.bottom always returns 0.0未检测到键盘。 MediaQuery.of(context).viewInsets.bottom 总是返回 0.0
【发布时间】:2020-03-30 12:42:58
【问题描述】:

我有一个脚手架,里面有一个 TextField。当键盘之前将字段移到键盘上方时,它总是覆盖该字段。这发生在我项目的所有页面上。

我已将 MediaQuery.of(context).viewInsets.bottom 添加到我的构建方法中,它始终返回 0.0。当键盘出现时,没有重建。我已经尝试将 resizeToAvoidBottomInset 设置为 true 和 false 而没有任何变化。我已经尝试将它包装在一个 Scrollable 小部件中,没有任何变化。

在 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)

【问题讨论】:

  • 您最近是否对项目进行了一些本地更改,因为您的问题似乎只是在 Android 中。
  • 能否请您添加代码和flutter doctor 结果?

标签: android flutter dart flutter-layout


【解决方案1】:

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

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

从应用程序中删除全屏的其他方法是在颤振页面中SystemChrome.setEnabledSystemUIOverlays([])

您可能要检查的另一件事是 resizeToAvoidBottomPadding: 在 Scaffold 中设置为 false。

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

【讨论】:

    【解决方案2】:

    如果是复杂的小部件树,即使键盘打开,MediaQuery.of(context).viewInsets.bottom 也会给出 null。所以,我们必须在树下改变值。

    这个包提供了简单易用的提供程序,用于从树中获取信息https://pub.dev/packages/flutter_keyboard_size

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

    【讨论】:

      【解决方案3】:

      当键盘打开时,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,即使键盘处于打开状态,

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            我需要混合flutter和Android,情况可能更复杂,&lt;item name="android:windowFullscreen"&gt;false&lt;/item&gt;SystemChrome.setEnabledSystemUIOverlays([])不适合我。

            最后AndroidManifest.xml 中的设置android:windowSoftInputMode="adjustResize" 对我有用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-08
              • 2018-07-16
              • 2018-05-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-12-24
              相关资源
              最近更新 更多