【Flutter入门练中学】第2课:布局系统
目标· 理解 Flutter 布局核心口诀父传约束子定尺寸父定位置。· 分清 Row / Column 的主轴与交叉轴掌握 mainAxisAlignment 和 crossAxisAlignment。· 掌握 Container、Padding、SizedBox、Expanded、Spacer 的用途。· 能组合实现个人信息行、上中下布局、商品卡片、音乐播放器。· 能识别并修复 RenderFlex overflowed 溢出错误。· 通过“题目要求 → 答案 → 答案解读”的多元化习题完成练中学。一、本课核心概念速览Flutter 布局口诀父传约束子定尺寸父定位置。常用布局 WidgetWidget 作用Row 水平排列Column 垂直排列Container 盒子尺寸、颜色、边距、圆角、对齐Padding 内边距Margin 外边距通常用 Container 的 marginExpanded 按比例占满剩余空间Flexible 灵活占空间可松可紧Spacer 占剩余空间做间隔SizedBox 固定宽高或间距Align / Center 对齐 / 居中MainAxisAlignment 主轴对齐CrossAxisAlignment 交叉轴对齐Row 的主轴是水平交叉轴是垂直。Column 的主轴是垂直交叉轴是水平。二、最小可运行示例把 lib/main.dart 改成importpackage:flutter/material.dart;voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});overrideWidgetbuild(BuildContextcontext){returnMaterialApp(home:Scaffold(body:Center(child:Row(mainAxisAlignment:MainAxisAlignment.spaceEvenly,children:const[Text(左),Text(中),Text(右),],),),),);}}按 r 热重载把 spaceEvenly 改成 spaceBetween、center、end观察变化。三、多元化习题练习0热重载体验布局题目要求运行上面的 Row 示例依次把 mainAxisAlignment 改成· MainAxisAlignment.start· MainAxisAlignment.center· MainAxisAlignment.end· MainAxisAlignment.spaceBetween· MainAxisAlignment.spaceAround· MainAxisAlignment.spaceEvenly记录每个值的效果。答案Row(mainAxisAlignment:MainAxisAlignment.spaceBetween,children:const[Text(左),Text(中),Text(右),],)各值效果· start靠左。· center整体居中。· end靠右。· spaceBetween两端贴边中间等距。· spaceAround每个子项两侧等距。· spaceEvenly所有间隔完全相等包括两端。答案解读mainAxisAlignment 控制主轴方向的对齐。Row 的主轴是水平所以这些值控制水平分布。Column 的主轴是垂直同样的值会控制垂直分布。热重载可以立刻看到差异是练布局最快的方式。练习1选择题题目要求在 Column 中crossAxisAlignment 控制的是哪个方向A. 垂直方向B. 水平方向C. 文字颜色D. 内外边距答案B。答案解读Column 的主轴是垂直交叉轴是水平。所以 mainAxisAlignment 控制垂直对齐crossAxisAlignment 控制水平对齐。Row 刚好相反。练习2判断题题目要求判断对错并说明理由Expanded 必须直接放在 Row、Column 或 Flex 的子级中。Container 的 padding 是外边距margin 是内边距。Spacer 可以用在 Row 和 Column 中。SizedBox 只能用来显示文字。答案对。错。对。错。答案解读Expanded 依赖 Flex 父级分配剩余空间所以不能随便放在普通 Container 里。padding 是内边距margin 是外边距。Spacer 本质是 Expanded(child: SizedBox())可用在 Row/Column。SizedBox 是尺寸盒子常用于占位和间距不显示文字。练习3连线题题目要求将左侧 Widget 与右侧作用连线左侧 右侧mainAxisAlignment 交叉轴对齐crossAxisAlignment 主轴对齐Expanded 固定尺寸或间距Spacer 按比例占剩余空间SizedBox 占剩余空间形成间隔Padding 内边距答案· mainAxisAlignment — 主轴对齐· crossAxisAlignment — 交叉轴对齐· Expanded — 按比例占剩余空间· Spacer — 占剩余空间形成间隔· SizedBox — 固定尺寸或间距· Padding — 内边距答案解读这些是布局系统最常用的成员。先分清主轴和交叉轴再理解剩余空间怎么分配布局就不容易乱。练习4排序题题目要求实现“页面居中显示一个圆角盒子盒子里有内边距文字居中”。按从外到内的嵌套顺序排列Text、Center、Container、Padding答案Center → Container → Padding → Text答案解读Center 负责整体居中Container 负责尺寸、颜色、圆角Padding 负责文字与盒子边缘的距离Text 是最内层内容。实际开发中Container 自带 padding也可以省掉单独的 Padding。练习5填空题题目要求补全代码让三个文字“左、中、右”分别贴在两端和中间Row(mainAxisAlignment:______,children:const[Text(左),Text(中),Text(右),],)答案Row(mainAxisAlignment:MainAxisAlignment.spaceBetween,children:const[Text(左),Text(中),Text(右),],)答案解读spaceBetween 会把第一个和最后一个推到两端中间的子项等距分布。做顶部栏、底部栏、左右分布时非常常用。练习6代码预测题题目要求阅读代码预测屏幕显示效果body:Center(child:Column(mainAxisAlignment:MainAxisAlignment.center,children:const[Text(上),SizedBox(height:20),Text(下),],),)答案“上”和“下”垂直排列整体在屏幕中间两者之间有 20 像素间距。答案解读Center 让 Column 在页面居中。Column 的 mainAxisAlignment.center 让子项在垂直方向整体居中。SizedBox(height: 20) 提供固定垂直间距。练习7改错题题目要求下面代码会导致布局溢出找出来并修正Row(children:const[Text(这是一段非常非常长的文字可能会撑爆屏幕),Text(这也是一段非常非常长的文字也可能撑爆屏幕),],)答案修正方式之一Row(children:const[Expanded(child:Text(这是一段非常非常长的文字可能会撑爆屏幕,overflow:TextOverflow.ellipsis,),),Expanded(child:Text(这也是一段非常非常长的文字也可能撑爆屏幕,overflow:TextOverflow.ellipsis,),),],)答案解读Row 主轴方向给子项无限宽度约束长文字会按自身宽度撑开超出屏幕就报 RenderFlex overflowed。用 Expanded 让文字按剩余空间分配宽度再用 overflow: TextOverflow.ellipsis 显示省略号。这是实际开发中最常见的布局修复之一。练习8补全代码题题目要求补全代码做一个 120×60 的蓝色圆角盒子内部有 12 内边距外边距 8文字白色居中Container(width:120,height:60,padding:constEdgeInsets.all(______),margin:constEdgeInsets.all(______),decoration:BoxDecoration(color:Colors.blue,borderRadius:BorderRadius.circular(______),),alignment:Alignment.______,child:constText(按钮,style:TextStyle(color:Colors.white),),)答案Container(width:120,height:60,padding:constEdgeInsets.all(12),margin:constEdgeInsets.all(8),decoration:BoxDecoration(color:Colors.blue,borderRadius:BorderRadius.circular(12),),alignment:Alignment.center,child:constText(按钮,style:TextStyle(color:Colors.white),),)答案解读padding 是盒子内部留白margin 是盒子外部留白。BoxDecoration 用来设置背景色和圆角。alignment: Alignment.center 让 child 在盒子内居中。注意使用 decoration 时颜色要写在 BoxDecoration 里不能同时写 color。练习9动手编码题个人信息行题目要求用 Row 做一行个人信息左边一个圆形头像中间显示姓名和职业右边一个按钮。要求中间区域用 Expanded 包裹防止文字太长溢出。答案body:Center(child:Padding(padding:constEdgeInsets.all(16),child:Row(children:[Container(width:56,height:56,decoration:constBoxDecoration(color:Colors.blue,shape:BoxShape.circle,),alignment:Alignment.center,child:constText(张,style:TextStyle(color:Colors.white,fontSize:20),),),constSizedBox(width:12),constExpanded(child:Column(crossAxisAlignment:CrossAxisAlignment.start,mainAxisSize:MainAxisSize.min,children:[Text(张三,style:TextStyle(fontSize:18,fontWeight:FontWeight.bold),),SizedBox(height:4),Text(Flutter 开发者),],),),constSizedBox(width:12),ElevatedButton(onPressed:(){},child:constText(关注),),],),),)答案解读Row 水平排列头像、信息、按钮。中间用 Expanded 占剩余宽度避免长文字溢出。Column 的 crossAxisAlignment.start 让姓名和职业左对齐。mainAxisSize: MainAxisSize.min 让 Column 高度尽量小。圆形头像用 BoxShape.circle。练习10动手编码题上中下布局题目要求用 Column 和 Expanded 做上中下布局顶部固定高度 60中间占满剩余空间底部固定高度 60。三个区域用不同颜色区分。答案body:Column(children:[Container(height:60,color:Colors.blue,alignment:Alignment.center,child:constText(顶部,style:TextStyle(color:Colors.white)),),Expanded(child:Container(color:Colors.grey.shade200,alignment:Alignment.center,child:constText(中间占满剩余空间),),),Container(height:60,color:Colors.green,alignment:Alignment.center,child:constText(底部,style:TextStyle(color:Colors.white)),),],)答案解读Column 垂直排列。顶部和底部用固定高度中间用 Expanded 吃掉剩余高度。这是 App 页面最经典的骨架顶部栏 内容区 底部栏。练习11综合挑战商品卡片题目要求做一个商品卡片外层圆角阴影内部有内边距。左边一个商品图标中间显示商品名和描述右边显示价格和购买按钮。要求使用 Container、Padding、Row、Column、Expanded、SizedBox。答案body:Center(child:Container(margin:constEdgeInsets.all(16),padding:constEdgeInsets.all(16),decoration:BoxDecoration(color:Colors.white,borderRadius:BorderRadius.circular(16),boxShadow:[BoxShadow(color:Colors.black.withOpacity(0.1),blurRadius:8,offset:constOffset(0,4),),],),child:Row(children:[Container(width:64,height:64,decoration:BoxDecoration(color:Colors.orange.shade100,borderRadius:BorderRadius.circular(12),),alignment:Alignment.center,child:constIcon(Icons.shopping_bag,color:Colors.orange,size:32),),constSizedBox(width:12),constExpanded(child:Column(crossAxisAlignment:CrossAxisAlignment.start,mainAxisSize:MainAxisSize.min,children:[Text(Flutter 实战课,style:TextStyle(fontSize:18,fontWeight:FontWeight.bold),),SizedBox(height:6),Text(从零开始练中学布局系统,style:TextStyle(color:Colors.grey),),],),),constSizedBox(width:12),Column(mainAxisSize:MainAxisSize.min,children:[constText(¥99,style:TextStyle(fontSize:18,color:Colors.red,fontWeight:FontWeight.bold,),),constSizedBox(height:8),ElevatedButton(onPressed:(){},child:constText(购买),),],),],),),)答案解读外层 Container 负责卡片边距、圆角、阴影。内部 Row 分三列图标、信息、价格按钮。中间信息列用 Expanded 占剩余宽度。右侧价格按钮用 Column 垂直排列。这个练习把本课大部分布局知识综合了起来。练习12开放式挑战音乐播放器界面题目要求用 Column、Expanded、Row、Container、Icon 设计一个简单的音乐播放器界面。要求· 顶部显示歌曲名· 中间 Expanded 区域显示专辑封面占位· 底部一排控制按钮上一首、播放、下一首。答案示例body:SafeArea(child:Column(children:[constPadding(padding:EdgeInsets.all(16),child:Text(正在播放练中学,style:TextStyle(fontSize:20,fontWeight:FontWeight.bold),),),Expanded(child:Container(margin:constEdgeInsets.all(24),decoration:BoxDecoration(color:Colors.deepPurple.shade100,borderRadius:BorderRadius.circular(24),),alignment:Alignment.center,child:constIcon(Icons.music_note,size:80,color:Colors.deepPurple,),),),Padding(padding:constEdgeInsets.all(16),child:Row(mainAxisAlignment:MainAxisAlignment.spaceEvenly,children:[IconButton(onPressed:(){},icon:constIcon(Icons.skip_previous,size:36),),IconButton(onPressed:(){},icon:constIcon(Icons.play_circle_fill,size:64),),IconButton(onPressed:(){},icon:constIcon(Icons.skip_next,size:36),),],),),],),)答案解读整体用 Column顶部标题、中间 Expanded 封面、底部控制栏。中间 Expanded 占满剩余空间。底部 Row 用 spaceEvenly 均匀排列按钮。开放题没有唯一答案重点是布局结构清晰、能运行、能热重载修改。练习13错误观察挑战题目要求故意制造一次 RenderFlex overflowed 错误在 Row 中放两个很长的 Text不要用 Expanded。运行后观察控制台错误记录关键错误词。答案示例错误代码Row(children:const[Text(这是一段非常非常非常非常非常非常非常长的文字),Text(这也是一段非常非常非常非常非常非常非常长的文字),],)控制台常见错误A RenderFlex overflowed by 123 pixels on the right.答案解读RenderFlex 是 Row/Column 的渲染对象。当子项总宽度超过可用宽度时就会溢出。右侧溢出会提示 on the rightColumn 溢出会提示 on the bottom。解决方法用 Expanded、Flexible、SingleChildScrollView 或 TextOverflow.ellipsis。学会看这个错误布局能力会提升很快。四、本课小结这一课你练了Row 和 Column 的主轴、交叉轴mainAxisAlignment 和 crossAxisAlignmentContainer、Padding、Margin、SizedBoxExpanded、Spacer 分配剩余空间用 Row/Column 组合出个人信息行、上中下布局、商品卡片、音乐播放器通过故意制造溢出学会看 RenderFlex overflowed 错误。下一课可以进入 滚动与列表ListView、SingleChildScrollView、GridView继续用“练中学”的方式做可滚动页面。

相关新闻

Netcatty 用 Claude Code + Ollama Cloud 替换 Cursor 的 Issue 自动化分类:可行性调研与仓库落地对照

Netcatty 用 Claude Code + Ollama Cloud 替换 Cursor 的 Issue 自动化分类:可行性调研与仓库落地对照

【免费下载链接】Netcatty SSH workspace, SFTP, and terminals in one 项目地址: https://gitcode.com/gh_mirrors/net/Netcatty 点击查看 免费下载 本文基于仓库调研文档 docs/research/claude-code-ollama-cloud-automation.md,完整梳理 Netcatty 将…

2026/10/9 2:37:40 阅读更多 →
LeetCode热题100刷题攻略:从题目+答案到面试实战

LeetCode热题100刷题攻略:从题目+答案到面试实战

简介:面向算法面试与LeetCode刷题人群的C题解合集,以PDF形式整理了热题100中的经典题目及对应答案,帮助读者在有限时间内掌握高频考点核心思路与代码实现。压缩包共包含1个PDF文件,整体约640KB,内容精炼、排版紧凑&…

2026/10/9 2:37:40 阅读更多 →
基于SpringBoot2+Vue3的相亲网站全栈开发实战

基于SpringBoot2+Vue3的相亲网站全栈开发实战

1. 需求拆解:相亲网站到底在做什么1.1 先别急着写代码,把"择偶条件"拆清楚拿到"基于SpringBoot2Vue3的相亲网站"这个题目的时候,我的第一反应不是急着建工程,而是把一个现实问题想明白:相亲网站和…

2026/10/9 2:37:40 阅读更多 →

最新新闻

标准模式如何打破大模型办公应用的不可能三角:接入与评测指南

标准模式如何打破大模型办公应用的不可能三角:接入与评测指南

在前段时间的办公场景落地中,我一直在纠结同一个问题:接入大模型能力时,到底该选效果最好的模型,还是选响应最快的通道,或者干脆选最便宜的方案?单独看每个指标都合理,但放到一起就成了一个很难…

2026/10/9 3:02:52 阅读更多 →
Smurf攻击协议层复现与防御:ICMP广播放大实战指南

Smurf攻击协议层复现与防御:ICMP广播放大实战指南

简介:本资源是一份面向网络安全初学者与中级运维人员的Smurf攻击原理与防御详解PPT课件,聚焦DDoS攻击中经典的ICMP反射型攻击场景,系统梳理其攻击机制、检测特征与三层防护策略。课件以清晰图示还原IP欺骗广播放大攻击流程,深入解…

2026/10/9 3:02:52 阅读更多 →
英伟达收购Hugging Face传闻背后:AI开发者的本地部署与风险应对指南

英伟达收购Hugging Face传闻背后:AI开发者的本地部署与风险应对指南

这次我们来看的不是某个新模型,而是一条刚被媒体曝出来的并购传闻:英伟达被曝同意以约 129 亿美元的价格收购 Hugging Face。消息一出,AI 开发社区基本分成两派——一派认为这是利好,模型托管平台终于有了算力巨头背书&#xff1b…

2026/10/9 3:02:52 阅读更多 →
NVIDIA 129亿收购 Hugging Face 传闻解读:开发者本地部署与镜像下载指南

NVIDIA 129亿收购 Hugging Face 传闻解读:开发者本地部署与镜像下载指南

这几天互联网上流传最猛的一条 AI 圈消息,就是“NVIDIA 准备以约 129 亿美元收购 Hugging Face”。先给一个冷静的判断:截至本文写作时,双方官方都还没有发布正式公告,所以它仍然是“传闻”而非“官宣”。但一个传闻能引发这么大范…

2026/10/9 3:02:52 阅读更多 →
自验证框架实战:从原理到代码,让开源模型在GitHub热榜逆袭

自验证框架实战:从原理到代码,让开源模型在GitHub热榜逆袭

之前在调研开源模型在数学推理、代码生成和复杂问答场景中的表现时,我发现一个很有意思的现象:不少团队在引入“自验证”(Self-Verification)思路后,模型效果提升非常明显,甚至有开源项目在 GitHub 热榜上超…

2026/10/9 3:02:52 阅读更多 →
Java共享自习室系统实战:Spring Boot、MyBatis与座位并发管理

Java共享自习室系统实战:Spring Boot、MyBatis与座位并发管理

简介:基于Java的共享自习室系统是一份面向高校学生和Java初学者的毕业设计完整项目,聚焦自习室预约与资源管理,从用户注册登录、自习室信息维护、预约规则设计到提醒通知均有实现,覆盖需求分析、数据库设计、接口开发、前端交互和…

2026/10/9 3:01:51 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →