思考:
在网页网站开发中,以及小程序开发中,或者Electron开发桌面应用时候,可以使用Html + css去定义页面以及样式,或者原生的IOS的swift也有类似的,那在Flutter我如何去弄了?比如说我已经得到一张产品原型图,我如何弄布局样式?
在Web、小程序、uni-app、electron等开发都是以HTML结构 + CSS样式方式,Flutter在这方面和它们有本质差异:
Flutter的UI思想
在Flutter 里没有 HHML/ CSS 文件,UI = 纯 Dart 代码构建。
HTML 标签 变成了 Flutter WidgetCSS 样式 变成了 Widget 属性(参数)布局 由一层层 Widget 树组合实现,嵌套 Container/Row/Column/Stack
所有UI都是Widget,包括布局容器、文本、按钮、图片、甚至内边距和外边距
对比HTML/ Flutter
<div class="card">
<img src="avatar.png" class="avatar">
<p class="name">张三</p>
</div>
.card {
display: flex;
flex-direction: column;
align-items: center;
}
.avatar {
width: 100px;
border-radius: 50%;
}
.name {
font-size: 18px;
font-weight: bold;
}
Flutter:
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ClipOval(
child: Image.asset(
'assets/avatar.png',
width: 100,
height: 100,
fit: BoxFit.cover,
),
),
const SizedBox(height: 10), // 相当于 margin-top
const Text(
'张三',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
],
)
Flutter 布局常用 Widget(对应 CSS 概念)
| Flutter Widget | 对应 CSS 概念 |
|---|---|
| Container | div + style(宽高、颜色、边框、padding、margin) |
| Row | flex-direction: row |
| Column | flex-direction: column |
| Stack | position: relative / absolute 布局 |
| Expanded / Flexible | flex: 1(弹性布局) |
| Align / Center | align-items / justify-content |
| Padding / SizedBox | padding / margin |
| Text + TextStyle |
+ CSS 字体样式 |
| BoxDecoration | CSS background、border、shadow |
从产品原型图到 Flutter 布局的流程
假设你有一个产品原型图,Flutter 的思路是:
看大框架:
顶部导航(AppBar?)主体布局(Row?Column?ListView?Stack?)底部导航栏(BottomNavigationBar?)
逐层拆解 Widget 树:
把每个区域拆成一个 Widget(相当于 Vue 组件拆分)。每个小区域用 Container 包裹,定义宽高、padding、颜色。
样式写在 Widget 属性里:
字体用 TextStyle背景用 BoxDecoration圆角、阴影用 borderRadius、boxShadow
边调试边热重载:
Flutter 热重载非常快,你改个 padding 就能立刻在模拟器里看到效果。
举个原型 → Flutter 实现例子
原型图(假设):一个卡片,里面有头像 + 用户名 + 简介。
Card(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
elevation: 4, // 阴影
margin: const EdgeInsets.all(16),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
ClipOval(
child: Image.asset(
'assets/avatar.png',
width: 50,
height: 50,
fit: BoxFit.cover,
),
),
const SizedBox(width: 12),
const Text(
'张三',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
],
),
const SizedBox(height: 12),
const Text(
'这是用户简介,展示个人的基本信息,内容可以换行。',
style: TextStyle(fontSize: 14, color: Colors.grey),
),
],
),
),
)
效果:一个有圆角+阴影的卡片,头像+名字在上面,简介在下面。
👉 在 HTML/CSS 里要写 class + flexbox + border-radius + box-shadow,但 Flutter 里就是 Widget 属性。
总结:
Flutter 没有 HTML/CSS,而是用 Widget 树 + 属性 来定义布局和样式。你拿到产品原型图后,就按 拆解模块 → 选择布局 Widget → 写样式属性 的流程来做。可以类比:
Container = div + CSSRow/Column = flexBoxDecoration = background/border/shadowTextStyle = CSS 字体样式



















暂无评论内容