我有一个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)
9条答案
按热度按时间5f0d552i1#
我最近遇到了这个问题。您是否已将全屏设置为true?如果启用了全屏,MediaQuery.viewInsets.bottom将返回0.0。既然你提到的问题只发生在Android,它可能是你设置的全屏属性在原生的Android文件.检查styles.xml
从应用程序中删除全屏的另一种方法是flutter page中的
SystemChrome.setEnabledSystemUIOverlays([])
。您可能还需要检查的一件事是在Scaffold中将
resizeToAvoidBottomPadding:
设置为false。在Flutter问题中也提出了这个问题:https://github.com/flutter/flutter/issues/25050
l5tcr1uw2#
我找到了这个问题的原因,但我不知道为什么。当控件处于Scaffold中时,键盘的出现和消失将不会在Scaffold中重建主体。您可以尝试将Scaffold替换为Material进行观察。如果你不想更换脚手架,我可以找到一个方法:
brccelvz3#
查看是否在
MaterialApp
中将useInheritedMediaQuery
设置为true
。如果是,则将其设置为false
。这是因为该属性强制小部件使用继承的上下文。例如,如果你在应用程序启动时立即弹出键盘,MediaQuery.of(context).viewInsets.bottom
的值与键盘的大小相同,但由于该上下文现在适用于儿童,因此它永远不会改变,即使键盘折叠。所以,当我面对这个问题时,我的简单解决方案是将useInheritedMediaQuery
设置为false
,这是这些天flutter应用程序的默认设置。jgovgodb4#
在复杂的小部件树MediaQuery.of(context). viewInsets.bottom的情况下,即使键盘打开,也会显示null。所以,我们必须沿着树向下改变值。
这个软件包提供了简单易用的提供程序,用于从树中获取信息https://pub.dev/packages/flutter_keyboard_size
或者,你可以自己在树中改变键盘大小的信息(你可以在包中查看代码)。
ubby3x7f5#
当键盘打开时,MediaQuery.of(context).viewInsets.bottom会发生更改以反映新的底部(现在位于键盘的顶部)。
但是,Android应用程序可能处于全屏状态:
在这种情况下,
viewInsets.bottom
将始终是0.0
,即使键盘打开,z9ju0rcb6#
为托管Flutter屏幕
in AndroidManifest.xml
的Activity设置android:windowSoftInputMode="adjustResize"
将修复此问题。lg40wkob7#
我需要混合flutter和Android,情况可能会更复杂,
<item name="android:windowFullscreen">false</item>
和SystemChrome.setEnabledSystemUIOverlays([])
不适合我。最后,
AndroidManifest.xml
中的设置android:windowSoftInputMode="adjustResize"
对我来说很有效。ckocjqey8#
尝试MediaQuery.of(context).viewInsets.bottom与scaffold上下文,而不是子窗口小部件。
对我很有效
uajslkp69#
我还没有看到我的解决方案,所以在这里发布。
听起来很奇怪,我使用了以下代码:
解决方案来自Github上的这条评论。
在我的例子中,我使用了SingleChildScrollView和
Row
的第一个例子,而不是Column
。一旦选择了
TextField
,Row
中的每个Column
都没有正确的高度,因此我需要在LayoutBuilder
中执行constraints.maxHeight + keyboardHeight
以获得正确的高度,无论键盘是否显示。