为何在SingleChildScrollView或ListView中使用Spacer会报错?
为什么不能在ListView/SingleChildScrollView中使用Spacer?
Spacer是Flex布局专属组件:Spacer的核心作用是在Row、Column这类Flex容器里,抢占剩余的可用空间,实现组件间的弹性间距。它内部依赖
FlexParentData与父级Flex容器交互,只有父级是Flex类型时,才能识别并处理这种布局数据。滚动容器不支持Flex布局协议:ListView和SingleChildScrollView的子组件是直接嵌入滚动视口的,它们的父级并非Flex容器,无法解析Spacer所需的
FlexParentData。强行放入Spacer时,组件会尝试给父级设置不被支持的布局数据,直接触发「Incorrect use of ParentDataWidget」错误。SizedBox能正常工作的原因:SizedBox是独立的尺寸容器,只负责固定自身宽高,不需要依赖父级的特殊布局协议。不管父级是滚动容器还是Flex容器,它都能正常渲染,所以用它设置间距不会出问题。
如果需要在滚动容器里实现弹性间距,可以把内容包裹在Column中(记得设置mainAxisSize: MainAxisSize.min避免无限高度),再将Column放入SingleChildScrollView,这样就能在Column内部正常使用Spacer了:
SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: [ TextField(decoration: InputDecoration(labelText: "用户名")), Spacer(), TextField(decoration: InputDecoration(labelText: "密码")), SizedBox(height: 20), ElevatedButton(onPressed: () {}, child: Text("登录")), ], ), )
内容的提问来源于stack exchange,提问作者Suman Devkota
相关产品推荐
相关产品推荐

