十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
原因:在flutter中,键盘弹起时系统会缩小Scaffold的高度并重建
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序制作、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了北戴河免费建站欢迎大家使用!
1)把Scaffold的resizeToAvoidBottomInset属性设置为false,这样在键盘弹出时将不会resize
2)把写死的高度改为 原高度 - MediaQuery.of(context).viewInsets.bottom ,键盘弹出时布局将重建,而这个 MediaQuery.of(context).viewInsets.bottom 变量在键盘弹出前是0,键盘弹起后的就是键盘的高度
将输入框放进可滚动的Widget中即可,当输入框获取焦点后,系统会自动将它滑动到可视区域
1、点击输入flutter框弹出软键盘时,遮挡本输入框一部分。
2、点击输入框,输入框跟随软键盘自动上移时其他不该移动的内容也跟随上移导致的flutter键盘弹出时listview置底。
当dialog里需要输入框弹出软键盘时,会造成遮挡问题
首先应该考虑用Scaffold当根布局将其背景设置为透明色
然后包裹Center 使dialog全屏居中
最后包裹自己的dialog内容
在耗时操作的时候,一般都要弹出一个加载框,然后在完成的时候再把加载框关掉,在Flutter中可以直接用showDialog()来弹出一个对话框。
这是一个简单的提示对话框,包含了关闭按钮,点击就能关闭。但一般的耗时操作完成,就需要我们自己把dialog关闭掉。
首先,开启dialog的时机。由于我们需要获取到BuildContext,所以就得等build()方法走完,这里可以用Future.delayed()来等创建好BuildContext再进行创建,或者用Timer来延迟操作,我选择了前者。
其中delayed()在initState()结尾来做就行,这里参考网友封装了一个LoadingDialog。
那么接下来要在什么时机关闭呢?
一开始,我理所当然的以为,是在异步方法结束后,去更新界面的时候关闭,也就是setState(() {})的时候,可是不管怎么尝试,用Navigator.pop()不行,用Navigator.of(context, rootNavigator: true).pop(result)也不行,用FlutterBoost.singleton.close(id)也不行,用FlutterBoost.singleton.closeCurrent()也不行,都会直接把非Dialog的页面也关闭掉,这让我百思不得其解,因为showDialog()的本质也是新建了一个Route出来,也就是最顶层的页面是弹出的Dialog,可是为什么关不掉呢。
一番思前想后,把showDialog的逻辑移到和异步逻辑同级,也就是setState(() {})外面,然后把showDialog()自身创建的BuildContext传进去就能正常关闭了。也就是,在setState(() {})的时候,其实用的context还是非Dialog页面的,所以关闭的当然就不是Dialog了。
持有Dialog自己的BuildContext,然后在异步以后调用就行了。
Future.delayed(Duration.zero, () {
showDialog(
context: context,
barrierDismissible: false,
builder: (_) {
return LoadingDialog();
});
});