【零代码革命】用Trae打造Flutter应用:AI助力,小白秒变工程师-页面调教篇

我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:www.trae.ai/?utm_source...

在上一篇文章中已经完成项目基础框架的搭建,在这一篇文章中通过不断调教AI,实现自己的APP页面。

实现目标

今天的目标是利用Trae完成一下页面的开发工作。

实战操作

设计图生成代码

1、第一步告诉Trae我们的需求是什么?

在昨天项目基础上,在ProfilePage文件中实现设计图中的效果

2、第二步,运行项目到模拟器,查看运行结果,这里我直接让Trae以Debug模式启动程序,方便后续代码修改查看效果

这一步和上一篇文章中的一样,一堆环境检测之后,运行程序到模拟器上面。

查看Trae生成的代码运行效果和设计图之间还是存在比较大的差异的,如图:

下一步就是详细一步一步调教AI修改代码了。

通过看图对比需要调整的问题如下:

1、通知和设置处不符合

2、每行的条目是圆角,部分字体大小不符合

3、数据统计处缺失

4、头部二维码图标位置不对

5、顶部标题栏也不符合

细节调整

1、调整页面背景色和圆角信息等

2、调整通知和设置栏目处的设计

3、付费功能栏目微调

4、头部视图的调整

5、数据统计处调整

5、图标调整

6、导航栏调整

经过上述一系列的调整之后,查看设计图与模拟器中运行效果,基本一致了。如图所示:

Ai完成后的代码

dart 复制代码
import 'package:flutter/material.dart';

class ProfilePage extends StatelessWidget {
  const ProfilePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: const Color(0xFFF7F7F7),
      ),
      backgroundColor: const Color(0xFFF7F7F7),
      body: ListView(
        children: [
          _buildHeader(),
          _buildStats(),
          _buildMenuItem('关注我的人(1)', Icons.people_outline, trailing: const Icon(Icons.chevron_right, color: Colors.grey)),
          _buildMenuItem('付费功能收入', Icons.monetization_on_outlined, trailing: Row(
            mainAxisSize: MainAxisSize.min,
            children: const [
              Text('去开通', style: TextStyle(fontSize: 14, color: Color(0xFF999999))),
              SizedBox(width: 4),
              Icon(Icons.chevron_right, color: Colors.grey),
            ],
          )),
          _buildMenuItem('传图片到素材库', Icons.image_outlined),
          const SizedBox(height: 8),
          Container(
            margin: const EdgeInsets.symmetric(horizontal: 16),
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(8),
            ),
            child: Column(
              children: [
                _buildMenuItem('通知', Icons.notifications_outlined, margin: EdgeInsets.zero),
                const Divider(height: 1, indent: 16, endIndent: 16, thickness: 0.5, color: Color(0xFFEEEEEE)),
                _buildMenuItem('设置', Icons.settings_outlined, showDot: true, margin: EdgeInsets.zero),
              ],
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildHeader() {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
      margin: const EdgeInsets.only(left: 16, right: 16, bottom: 8),
      decoration: const BoxDecoration(
        color: Color(0xFFF7F7F7),
      ),
      child: Row(
        children: [
          CircleAvatar(
            radius: 32,
            backgroundColor: Colors.grey[200],
            child: const Icon(Icons.person_outline, size: 40, color: Colors.grey),
          ),
          const SizedBox(width: 16),
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                const Text(
                  'use AI小民工',
                  style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600),
                ),
                const SizedBox(height: 6),
                const Text(
                  '微信号:gh_79788deba2e6',
                  style: TextStyle(fontSize: 15, color: Color(0xFF666666)),
                ),
              ],
            ),
          ),
          Container(
            padding: const EdgeInsets.all(2),
            decoration: BoxDecoration(
              border: Border.all(color: const Color(0xFF666666), width: 0.5),
              borderRadius: BorderRadius.circular(2),
            ),
            child: const Icon(Icons.qr_code, size: 12, color: Color(0xFF666666)),
          ),
          const SizedBox(width: 4),
          const Icon(Icons.chevron_right, color: Colors.grey),
        ],
      ),
    );
  }

  Widget _buildStats() {
    return Container(
      padding: const EdgeInsets.all(16),
      margin: const EdgeInsets.only(bottom: 8, left: 16, right: 16),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(8),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            children: [
              const Text(
                '数据统计',
                style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
              ),
              const SizedBox(width: 8),
              Text(
                '更新至2025/02/19',
                style: TextStyle(fontSize: 12, color: Colors.grey[600]),
              ),
              const Spacer(),
              const Icon(Icons.chevron_right, color: Colors.grey),
            ],
          ),
          const SizedBox(height: 16),
          Row(
            children: [
              Expanded(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    const Text(
                      '6',
                      style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500),
                    ),
                    const SizedBox(height: 4),
                    Text(
                      '昨日阅读',
                      style: TextStyle(fontSize: 12, color: Colors.grey[600]),
                    ),
                  ],
                ),
              ),
              Expanded(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    const Text(
                      '0',
                      style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500),
                    ),
                    const SizedBox(height: 4),
                    Text(
                      '昨日分享',
                      style: TextStyle(fontSize: 12, color: Colors.grey[600]),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }

  Widget _buildMenuItem(String title, IconData icon, {Widget? trailing, bool showDot = false, EdgeInsetsGeometry? margin}) {
    return Container(
      margin: margin ?? const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
      decoration: margin == null ? BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(8),
      ) : null,
      child: ListTile(
        title: Text(
          title,
          style: const TextStyle(fontSize: 16),
        ),
        trailing: Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            if (showDot) Container(
              width: 6,
              height: 6,
              margin: const EdgeInsets.only(right: 4),
              decoration: const BoxDecoration(
                shape: BoxShape.circle,
                color: Colors.green,
              ),
            ),
            trailing ?? const Icon(Icons.chevron_right, color: Colors.grey),
          ],
        ),
      ),
    );
  }
}

总结

通过以上操作之后,完成了一个静态页面的开发工作,期间最重要的是和AI沟通,告诉它你想要什么讲清楚,上下文环境越清楚越好,生成的页面微调还是比较耗时的,如何懂一些基础开发,和AI配合会大大提升效率的。

在上一篇文章中已经完成项目基础框架的搭建,在这一篇文章中通过不断调教AI,实现自己的APP页面。

相关推荐
lvchaoq几秒前
页面停留时间过长导致token过期问题
前端
elangyipi1235 分钟前
深入理解前端项目中的 package.json 和 package-lock.json
前端·json
LYFlied17 分钟前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
composurext18 分钟前
录音切片上传
前端·javascript·css
程序员小寒18 分钟前
前端高频面试题:深拷贝和浅拷贝的区别?
前端·javascript·面试
狮子座的男孩23 分钟前
html+css基础:07、css2的复合选择器_伪类选择器(概念、动态伪类、结构伪类(核心)、否定伪类、UI伪类、目标伪类、语言伪类)及伪元素选择器
前端·css·经验分享·html·伪类选择器·伪元素选择器·结构伪类
zhougl99624 分钟前
Vue 中的 `render` 函数
前端·javascript·vue.js
听风吟丶25 分钟前
Spring Boot 自动配置深度解析:原理、实战与源码追踪
前端·bootstrap·html
跟着珅聪学java26 分钟前
HTML中设置<select>下拉框默认值的详细教程
开发语言·前端·javascript
IT_陈寒27 分钟前
JavaScript 性能优化:5个被低估的V8引擎技巧让你的代码提速50%
前端·人工智能·后端