flutter 在布局最顶端使用的是Scaffold组件,在点击输入框键盘弹出后,布局的默认反应是改变屏幕大小重新布局。
这时通常会在Scaffold中添加选项:
resizeToAvoidBottomPadding:false
添加之后,应用整体布局不会随着键盘弹出而刷新改变。
但是键盘的弹出仍然会改变 MediaQuery.of(context).size获取到的数值,因此如果有输入框的父组件通过MediaQuery来决定自身大小的话,在键盘弹出的时候整个组件仍然会进行刷新导致键盘隐藏。
因为只考虑移动端,屏幕大小不会发生改变,所以考虑将屏幕大小提前保存成固定的数值。
import 'dart:ui';
//1.获取屏幕物理大小
double physicalWidth = window.physicalSize.width;
double physicalHeight = window.physicalSize.height;
// 2.获取dpr
double dpr = window.devicePixelRatio;
// 3.宽度和高度
double screenWidth = physicalWidth / dpr;
double screenHeight = physicalHeight / dpr;
app启动之前提前获取好屏幕大小,在布局时直接引用,键盘弹出时就不会出现组件刷新导致键盘隐藏的问题。
-------------------------------------2022.5.27 更新----------------------------------------
额外补充一个奇怪的bug:
此bug只在IOS端出现,同样的代码在安卓端不存在。iphone测试机为IOS 15.4.1。
主要表现为window.physicalSize返回的大小有时正确有时为0
可能导致的原因猜测为window.physicalSize调用的过早,通过延迟调用后bug解决。
//延迟0.5秒加载屏幕大小
Timer.periodic(Duration(milliseconds: 500), (timer) async {
//获取屏幕大小
timer.cancel()
});文章来源:https://www.toymoban.com/news/detail-494354.html
此bug会导致某些依赖屏幕大小的Widget随机出现消失情况,bug非常隐蔽,帮大家避避坑。文章来源地址https://www.toymoban.com/news/detail-494354.html
到了这里,关于Flutter 点击输入框后 键盘闪出后立刻消失的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!