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

Ducafecat
9 min read4 days ago

--

视频

https://youtu.be/k7NzQM_zlX8

https://www.bilibili.com/video/BV1htCnY4ET6/

前言

原文 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,不好控制

感谢阅读本文

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

© 猫哥 ducafecat.com

end

--

--

Ducafecat
Ducafecat

No responses yet