Flutter modal_bottom_sheet内容偶发裁剪(无ListView场景)问题求助
modal_bottom_sheet内容随机裁剪问题解决方案
问题根源
modal_bottom_sheet默认采用动态高度估算逻辑,初始化渲染时会先根据父容器约束给出一个预估高度,等子组件完全布局后再调整,但多层Expanded组件的嵌套会干扰这个高度计算逻辑:
- 普通页面的Scaffold有确定的屏幕高度约束,
Expanded可以正常计算占比,不会出现问题 - 放在modal_bottom_sheet中时,动态高度和多层
Expanded的高度请求冲突,会出现随机高度裁剪的情况,关闭弹窗时约束失效,所以能看到完整内容
修复方案
- 首先在调用
showModalBottomSheet的位置配置isScrollControlled: true,该参数会让弹窗高度完全跟随子组件内容计算,而非默认的半屏预估值 - 移除页面代码中冗余的
Expanded嵌套:你当前代码中存在三层Expanded嵌套,在动态高度容器内不需要用Expanded填充剩余高度,直接让内容自适应即可 - 若表单内容可能超出屏幕高度,将最内层承载
vm.formWidgets的Column替换为SingleChildScrollView,不需要嵌套Expanded - 可选优化:如果仍偶现高度计算偏差,可在build方法内添加帧绘制完成回调,强制触发一次重绘即可,示例如下:
@override Widget build(BuildContext context, ScopedReader watch) { // 新增下面这段代码 WidgetsBinding.instance.addPostFrameCallback((_) { context.markNeedsBuild(); }); // 原有逻辑 final vm = watch(itemImageFormVmProvider!); vm.context = context; // ...其余原有代码 }
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

