Fulltter 的UI思想

思考:

在网页网站开发中,以及小程序开发中,或者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 字体样式

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容