Flutter 上的一个 Bug 带你了解键盘与路由的另类知识点
事情是这样的,由于近期 Flutter 发布了 1.17 的稳定版,按照“惯例”开始着手把生产项目升级到 1.12.13+hotfix.9 版本,在升级适配完成之后,一个突如其来的 Bug 让我陷入了沉思。 如上图所示,可以看到在键盘 B 页面打开后,退回上一个页面 A 时键盘已经收起,但是原先键盘所在的区域在 A 页面变成了空白,而 A 页面内容也被 resize 成了键盘弹出后的大小。 1、Scaffold 针对这个问题,首先想到的 Scaffold 的 resizeToAvoidBottomInset 属性。 在 Flutter 中 Scaffold 默认情况下 resizeToAvoidBottomInset 为 true ,当 resizeToAvoidBottomInset 为 true 时, Scaffold 内部会将 mediaQuery.viewInsets.bottom 参与到 BoxConstraints 的大小计算,也就是 键盘弹起时调整了内部的 bottom 位置来迎合键盘。 但是问题发送在 A 界面,这时候键盘已经收起, mediaQuery.viewInsets.bottom 应该更新为 0 ,那为何界面没有产生应有的更新呢? 2、MediaQuery 那么猜测问题可能出现在 MediaQuery 上。 从源码我们得知 MediaQuery 是一个