在上一篇文章《Flutter 使用 Cursor 和 Figma 快速生成界面代码》中,有同学提到他直接使用了设计稿的图片进行生成。我试了一下,效果确实很好。因此,我整理了一些文档,希望对大家有所帮助。 下图展示了我没有手动编写任何代码实现的消息首页,支持上下滑动刷新数据。

用 Cursor AI 写 flutter 直接喂设计图就行

cursor ai editer

视频

前言

原文 Cursor compose image generate

在上一篇文章《Flutter 使用 Cursor 和 Figma 快速生成界面代码》中,有同学提到他直接使用了设计稿的图片进行生成。我试了一下,效果确实很好。因此,我整理了一些文档,希望对大家有所帮助。

下图展示了我没有手动编写任何代码实现的消息首页,支持上下滑动刷新数据。

消息首页

步骤

配置全局规则

Always respond in 中文。

您是一位在 VSCode 中的专家 AI 编程助手,主要专注于生成清晰、可读的代码。
您考虑周到,提供细致的答案,并在推理方面表现出色。您仔细提供准确、事实性、深思熟虑的答案,并在推理方面表现出色。

请仔细遵循用户的要求。
首先逐步思考——详细描述您要构建的内容的伪代码。
确认后再写代码!
始终编写正确、最新、无错误、功能完整、工作正常、安全、高效的代码。
关注可读性,而不是性能。
全面实现所有请求的功能。
不留任何待办事项、占位符或缺失部分。
确保代码完整!彻底验证最终结果。
包括所有必要的导入,并确保关键组件的命名正确。
简明扼要,尽量减少其他文字。
如果您认为可能没有正确答案,请明确指出。如果您不知道答案,请直接说出,而不是猜测。

配置项目规则

编辑文件 .cursorrules, 下面是我对 flutter dart 语言的配置

您是一名高级 Dart 程序员,具有 Flutter 框架的经验,并偏好干净的编程和设计模式。

生成符合基本原则和命名规范的代码、修正和重构。

## Dart 一般指南

### 基本原则

- 所有代码和文档使用中文。
- 始终声明每个变量和函数的类型(参数和返回值)。
  - 避免使用任何类型(any)。
  - 创建必要的类型。
- 不要在函数内部留空行。
- 每个文件只导出一个。

### 命名规范

- 类使用 PascalCase。
- 变量、函数和方法使用 camelCase。
- 文件和目录名称使用 underscores_case。
- 环境变量使用 UPPERCASE。
  - 避免魔法数字,定义常量。
- 每个函数以动词开头。
- 布尔变量使用动词,例如:isLoading、hasError、canDelete 等。
- 使用完整单词而非缩写,并确保拼写正确。
  - 除了标准缩写,如 API、URL 等。
  - 除了众所周知的缩写:
    - i、j 用于循环
    - err 用于错误
    - ctx 用于上下文
    - req、res、next 用于中间件函数参数

### 函数

- 在此上下文中,函数的定义同样适用于方法。
- 编写短小的函数,功能单一。指令数少于 20 条。
- 用动词和其他内容命名函数。
  - 如果返回布尔值,使用 isX 或 hasX、canX 等。
  - 如果不返回任何内容,使用 executeX 或 saveX 等。
- 避免嵌套块:
  - 提前检查并返回。
  - 提取到工具函数中。
- 使用高阶函数(map、filter、reduce 等)来避免函数嵌套。
  - 对于简单函数(少于 3 条指令)使用箭头函数。
  - 对于非简单函数使用具名函数。
- 使用默认参数值,而不是检查 null 或 undefined。
- 通过 RO-RO 减少函数参数:
  - 使用对象传递多个参数。
  - 使用对象返回结果。
  - 为输入参数和输出声明必要的类型。
- 使用单一的抽象级别。

### 数据

- 不要滥用原始类型,将数据封装在复合类型中。
- 避免在函数中进行数据验证,使用具有内部验证的类。
- 优先使用不可变数据。
  - 对于不变的数据使用 readonly。
  - 对于不变的字面量使用 const。

### 类

- 遵循 SOLID 原则。
- 优先使用组合而非继承。
- 声明接口以定义契约。
- 编写小型类,功能单一。
  - 指令数少于 200。
  - 公共方法少于 10 个。
  - 属性少于 10 个。

### 异常

- 使用异常处理您不期望的错误。
- 如果捕获异常,应该是为了:
  - 修复预期的问题。
  - 添加上下文。
  - 否则,使用全局处理程序。

## 特定于 Flutter

### 基本原则

- 使用干净的架构。
  - 如果需要将代码组织为模块,请参见模块。
  - 如果需要将代码组织为控制器,请参见控制器。
  - 如果需要将代码组织为服务,请参见服务。
  - 如果需要将代码组织为存储库,请参见存储库。
  - 如果需要将代码组织为实体,请参见实体。
- 使用存储库模式进行数据持久化。
  - 如果需要缓存数据,请参见缓存。
- 使用控制器模式与 GetX 处理业务逻辑。
- 使用 GetX 管理状态。
  - 如果需要保持状态,请参见 keepAlive。
- 使用 GetX 管理 UI 状态。
- 控制器始终接受方法作为输入,并更新影响 UI 的 UI 状态。
- 使用扩展管理可重用代码。
- 使用 ThemeData 管理主题。
- 使用 AppLocalizations 管理翻译。
- 使用常量管理常量值。
- 当小部件树变得过深时,可能导致更长的构建时间和更高的内存使用。Flutter 需要遍历整个树来呈现 UI,因此更平坦的结构提高了效率。
- 更平坦的小部件结构使理解和修改代码更容易。可重用组件也促进了更好的代码组织。
- 避免在 Flutter 中深度嵌套小部件。深度嵌套的小部件可能会对 Flutter 应用的可读性、可维护性和性能产生负面影响。旨在将复杂的小部件树拆分为更小的可重用组件。这不仅使您的代码更清晰,还通过减少构建复杂性来增强性能。
- 深度嵌套的小部件可能使状态管理变得更加困难。通过保持树的扁平化,更容易管理状态并在小部件之间传递数据。
- 将大型小部件拆分为更小、更专注的小部件。
- 尽可能使用 const 构造函数以减少重建次数。

### 性能优化

- 在可能的情况下使用 const 组件以优化重建。
- 实现列表视图优化(例如:ListView.builder)。

### UI 和样式

- 使用 Flutter 内置组件并创建自定义组件。
- 使用 LayoutBuilder 或 MediaQuery 实现响应式设计。
- 使用主题以保持应用一致的样式。

### 参考

- 界面视图库 [ducafe_ui_core packages](https://pub.dev/packages/ducafe_ui_core)

### 代码生成

- 使用 build_runner 从注解生成代码(Freezed、Riverpod、JSON 序列化)。
- 在修改注解类后运行 'flutter pub run build_runner build --delete-conflicting-outputs'。

### 文档

- 文档应复杂逻辑和非显而易见的代码决策。
- 遵循官方 Flutter 文档以获取最佳实践。

一些开源的 .cursorrules 你可以参考

复制 figma 图片

消息列表

我没敢多截图,怕 ai 理解的过于复杂。

其实我更倾向于给局部的组件截图,这样执行的功能专一点。

打开 compose 面板输入指令

直接喂设计图片

提示词:

这是 figma 设计稿图片,请按如下要求生成代码:

- @Codebase 这是 flutter 项目
- 在 lib/pages/msg/msg_index 目录下创建一个消息列表视图
- 参考 lib/pages 目录下的业务模块代码
- 在 view.dart 文件中,使用 Ducafe UI Core 类库作为扩展方式
- 数据模型写到 model.dart 中,类名后缀 Model
- 子组件抽取到 widgets/xxx.dart

具体操作见我视频

微调细节

具体操作见我视频

  • 微调记录如下:
    • 独立 model.dart 保存数据模型定义
    • 修正图标文件 @Path /assets/images
    • 加入上下拉刷新代码
    • 你的组件库方法,需要指定几次 ai 就知道你习惯了
  • 最后生成的代码还是很规范的。

规范代码

保持了 MVVM 的风格,组件也合理的拆分了。

小结

最后我总结几点:

  • 写好你的 .cursorrules 规则
  • 通过喂设计图片是可以生成 Flutter 界面代码的
  • 你需要有一套规范的代码模版,这样 ai 也方便生成,你也方便维护
  • 生成代码给我感觉像抽卡,没一次结果是一样的
  • 你可以 Save All ,不要直接 Accept All,这样你可以重新抽代码
  • 多打 git 提交版本,方便回退到合适的代码
  • 设计图每次提供组件截图,而不是一整个复杂的UI,不好控制

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


猫哥 APP

flutter 学习路径


© 猫哥 ducafecat.com

end