DevLog:2026年1月8日

1、昨天在引入flutter_quill之后未做测试,今天首次测试又遇到了The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation.的错误提示,这是CocoaPods同步问题,通常发生在添加新依赖后,需要运行pod install以同步Podfile.lock,并且flutter_quill在macOS上需要原生桥接库(quill_native_bridge_macos),Cursor还提醒我如果后续添加新的原生依赖,记得在macos/目录下运行pod install

2、把这条也添加到了Cursor的User Rules里,并且也跟Cursor明确了这个要求,完整的说法应该是“以后在Flutter macOS项目中添加新依赖后,会自动在macos/目录下运行pod install以同步CocoaPods依赖”,看看以后是否还会出现类似问题

3、测试发现编辑模式无法正常使用,切换到编辑模式后,提示“UnimplementedError:FlutterQuillLocalizations instance in required and could not found. Add the delegate ’FlutterQuillLocalizations.delegate’ to your widget app (e.g., MaterialApp) to fix.”

4、原因在于flutter_quill需要FlutterQuillLocalizations.delegate来提供本地化字符串,Cursor在修改过程中添加了flutter_localizations依赖,在MaterialApp中添加了本地化支持,再次测试可正常启用编辑模式,其中的格式按钮也基本都可正常使用,但是我自己创建的笔记在预览状态下只能显示纯文本,即使我添加了Markdown语法标记也看不到Markdown渲染的效果,然后也看不到使用富文本编辑器编辑后的所有效果(试了几个不同的格式,只有斜体可以在预览状态下看到),并且所有的文字内容都没有左对齐,像是每一行前面都有很多空白

5、Cursor认为原因在于之前使用了toPlainText()保存,会丢失所有格式,改成了保存Delta JSON格式,保留所有富文本格式(粗体、斜体、列表、代码块等),关于预览模式的显示,对于富文本内容使用QuillEditor只读模式显示,可显示所有格式,对于纯文本/Markdown内容使用MarkdownBody显示,支持Markdown语法渲染,并且可以自动检测内容格式,选择合适的显示方式,关于左对齐的问题,移除了可能导致对齐问题的外层滚动视图,使用Padding直接包裹编辑器,确保内容左对齐

6、测试发现基本实现了上面所说的效果,富文本内容和Markdown内容都可以在预览界面正常显示了,但在过程中反复出现了构建失败-反馈错误-Cursor修改的过程,最后原因是前面修改功能后出现了语法错误,比如括号匹配问题、readOnly参数使用问题,修复后可以正常构建,于是要求Cursor以后在修改文件后先检查有没有语法错误,再总结具体都修改了哪些,这样也能减少一些反复测试、反馈、修改的工作量

7、Cursor回复:已记录该工作流程,新的工作流程是

1.修改代码

2.立即检查语法错误(运行flutter analyze检查分析错误、使用read_lints检查linter错误、修复所有语法和编译错误)

3.确认无误后,再总结修改内容

8、继续丰富功能,目前比较刚需的功能是上传和解读图片功能,需要加高消息输入框,并在消息输入框右侧的联网搜索按钮上方增加一个附件按钮,点击可以打开系统的文件浏览器选择图片,需要支持常见的图片格式,并且在选择-上传图片之后,不立即发送给AI,而是在输入框上方以浮窗形式显示缩略图,需要用户输入文字形式的指令,并点击发送按钮,才能发送给AI,看下Cursor对这种比较复杂的指令的理解和实现程度如何

9、修改过程包括添加依赖(file_picker文件选择和image图片处理)、修改输入框(加高、添加_selectedImages列表存储选中的图片)、添加附件按钮、实现图片选择功能(使用FilePicker.platform.pickFiles打开系统文件浏览器,支持jpg/jpeg/png/gif/webp/bmp,且支持多选)、实现图片预览浮窗(显示80*80的缩略图、每张图片右上角有删除按钮、提供清除按钮清除所有图片、仅在选中图片时显示)、修改发送逻辑、修改ViewModel、修改AI Service,实现的功能包括图片选择、图片预览、延迟发送、组合发送、图片管理

10、构建应用并测试一下图片上传功能,首先点击新增的附件按钮就出现了选择图片失败的提示,Invalid argument(allowedExtensions),并且上传附件的按钮样式,和联网搜索、发送按钮的样式区别也比较大,也需要调整一下

11、反馈后,Cursor修复了图片选择错误,原因在于FileType.image与allowedExtensions不能同时使用,将FileType.image改为FileType.custom,同时修改了附件按钮的样式为Icons.attach_file_outlined和Icons.attach_file

12、再次测试,点击添加附件按钮出现了如下调试信息,Cursor认为这是macOS沙盒权限的问题

Unable to obtain a task name port right for pid 601: (os/kern) failure (0x5)

Unable to display open panel: your app is missing the User Selected File Read app sandbox entitlement. Please ensure that your app’s target capabilities include the proper entitlements.

13、于是在两个entitlements文件(DebugProfile.entitlements-DEBUG和Profile构建配置、Release.entitlements-Release构建配置)中添加了必要的权限:启用应用沙盒、允许读取用户通过文件选择器选择的文件、允许网络请求,之后Clean Build Folder,继续测试

14、重新生成Flutter ephemeral文件后,可以正常构建,可以选择图片、上传图片、发送图片及问题,但发送之后看不到缩略图,需要优化下,即使发送图片之后,也要在对话界面看到缩略图,可以和文字消息合并到一起

15、另外发图片给DeepSeek系列模型的API后才发现它不支持多模态输入输出,会报错HTTP 400,Invalid content type.image_url is only supported by certain models,看样子在模型管理界面还需要识别并标示一下哪个模型支持读取图片,比如点击测试按钮即可同步测试连通性以及是否支持图片及附件,并在模型列表中标示

16、以上两个问题同时反馈给Cursor,修改过程包括消息显示优化(支持图片缩略图)、数据模型扩展(支持图片路径)、数据库升级(添加图片路径字段)、发送消息逻辑(保存图片路径)、模型管理界面(图片支持测试,如果模型支持图片,显示“支持图片标识”)、模型配置扩展(图片支持标识)

17、测试修改效果,支持图片的模型可以看到蓝色的“支持图片”的标识,我需要给测试之后不支持图片的模型加上“不支持图片”的标识,但颜色上要有所区别,比如不支持图片的标识和文字用红色,同时,是否支持图片的标识也需要在AI对话的模型选择界面显示,方便用户选择模型,另外,虽然Claude Sonnet 4支持读取图片,但给它发图之后依然收到了不支持图片的Invalid content type.image_url is only supported by certain models错误提示

18、修改后再次测试发现,虽然在测试时可以看到“不支持图片”的红色标识,但这个红色标识并不会像“支持图片”的蓝色标识一样会一直存在,并且在AI对话的模型选择页面里,也看不到“不支持图片”的红色标识,只能看到“支持图片”的蓝色标识,另外,AI对话的模型选择页面需要优化一下显示效果,使用类似“设置-数据统计”页面的卡片形式,继续让Cursor修改

19、Cursor添加了imageSupportTested字段,修复模型管理界面的标识持久化,并优化了模型选择界面,再次测试功能正常

20、然后就是上面提到的,虽然Claude Sonnet 4的API支持读取图片,但给它发图之后依然返回了“Invalid content type.image_url is only supported by certain models”错误提示,Cursor认为这是因为Claude API使用了与OpenAI不同的图片格式,导致发送图片时出现这种错误提示,在修改过程中添加了_isClaudeAPI()方法,检测是否为Claude API(通过baseURL、模型名称或备注判断),并且进行了图片格式适配、请求头适配、请求体适配、流式响应处理等操作,再次测试,遇到了新BUG,上传图片后看不到缩略图了,并且还有同样的HTTP 400错误信息,明天再修改

DevLog:2025年12月15日

1、继续测试深度思考功能是否正常,换不同的问题问一下支持深度思考的模型,以及对话的置顶/修改/删除功能(已有按钮,和之前使用Swift的ChatWith操作方式一致,但按钮的样式变了,可能是安卓原生的按钮?)

2、测试发现未能显示深度思考内容,且即使在问题中增加了“最新”这样的提示词,也未能联网获取最新信息,对话的三个操作按钮中,置顶/取消置顶功能正常,修改标题后在列表中仍然显示原标题,删除后可正常进入回收站,也能从回收站中恢复到对话列表,且在回收站里的对话会显示为修改后的标题

3、除了要修正上面的问题外,还需要补充的功能包括触发联网搜索、显示联网搜索的参考链接、测试模型是否可用,继续对Cursor提出需求如下:

1.只要是与支持深度思考的模型对话,就在对话最上方显示思考内容,默认展开,可在回答结束后折叠

2.只要我在模型设置中填写了Tavily Key,在回答时就调用Tavily的联网搜索能力,并且在回答内容下方显示参考链接,样式需要与回答内容有所区别

3.在添加/编辑模型页底部增加测试按钮,点击测试模型是否可正常使用,如果不能正常使用需要给出错误信息

4.在对话上左滑修改对话标题后,对话列表里仍然显示为原标题,但在回收站里的对话会显示为修改后的标题

5.对话列表里,只能看到最后一个问题,看不到最后一次回答,我需要在每个对话的标题下方显示一行最后一次回答的内容

4、修改完成后测试上述功能,发现:

1.与支持深度思考的模型对话时,仍然未能看到思考内容,又添加了另一个支持深度思考的模型(DeepSeek官方的deepseek-reasoner),也看不到思考内容,但是回答的速度还是挺快的

2.联网搜索功能已实现,点击参考链接不会直接打开,而是可以看到完整链接,并且可以选中、复制,可能改成点击直接跳转至默认浏览器打开链接会比较合适

3.模型测试功能已实现

4.已实现需求,对话列表里可以看到修改后的标题,但不是我最后一次提出的问题

5.创建新的对话,已经可以在列表里看到最后一次回答的内容,可能已经改好了?

5、基于上述测试结果,继续提出修改需求:

1.对于联网搜索的参考链接,我需要点击后直接在默认浏览器中打开

2.在对话列表中,我需要对话的标题默认显示我提出的最后一个问题,如果我修改了标题,则一直显示为修改后的标题

3.AI回答的内容下方,除了收藏按钮之外,还需要增加一个复制按钮,点击可将回答内容(不含参考链接)复制到剪贴板,并且在点击收藏和复制按钮时,要分别有收藏成功、复制成功的toast提示

6、修改过程中,对于上述第一个需求,出现了/Users/jinlei.wu/Documents/GitHub/ChatWith/chatwith_flutter/ios/Runner/GeneratedPluginRegistrant.m:24:9 Module ‘url_launcher_ios’ not found的错误提示,无法构建,Cursor认为这是在添加url_launcher后,iOS项目需要更新CocoaPods依赖,修改之后可以正常构建并在模拟器中运行应用,并且上述三个需求均已实现

7、仍有如下需求未能实现,后面在Cursor中开启新对话时再看能否实现:

对话页、收藏页、设置页三个页面的标题仍然是居中显示(第二次修改无效),看不到支持深度思考的模型的思考内容(第三次修改无效)

8、还需要处理一下目前Xcode中出现的警告信息:/Users/jinlei.wu/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.6/ios/url_launcher_ios/Sources/url_launcher_ios/URLLauncherPlugin.swift:22:26 ‘keyWindow’ was deprecated in iOS 13.0: Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes,看样子还是刚刚添加的url_launcher导致的问题

DevLog:2025年12月8日

1、继续上周对移动端ChatWith的修改(或者说重写),用跨端开发框架Flutter替换Swift,“我需要你按照你的建议,帮我完全迁移,并且使用你推荐的技术栈”,Cursor列举了如下步骤:

1.创建Flutter项目结构和配置文件

2.实现核心数据模型(Message、Conversation、AIModel)

3.实现数据库层(SQLite+DAO)

4.实现API服务层(OpenAI流式输出)

5.实现Riverpod状态管理

6.实现UI层(启动页、主框架、对话列表、聊天界面、收藏、设置)

7.实现Markdown渲染和主题系统

8.配置全屏显示和平台特定设置

2、Cursor只用了十来分钟就写完了数十个文件,但接下来还需要我安装Flutter SDK、进入项目并安装依赖、生成代码,然后才能运行应用

3、目前涉及的技术栈包括:状态管理: Riverpod 2.5.1、网络请求: Dio 5.4.0、本地存储: SQLite + SharedPreferences、Markdown: flutter_markdown 0.6.18

4、手动下载并解压Flutter SDK之后,我不知道下一步该怎么配置,直接跟Cursor说“我已经下载了Flutter SDK,下一步怎么操作”,它就在电脑里搜索到了Flutter SDK的位置是/Users/jinlei.wu/Documents/Dev/flutter,然后开始配置环境变量,并验证安装、安装项目依赖、生成代码,之后还创建了一个总结文档

5、但不清楚目前怎样在iOS端运行应用,于是询问“怎样在浏览器里打开当前应用?怎样在Xcode中通过模拟器打开当前应用?”,Cursor直接给我提供了两个运行说明文档QUICK_RUN.md和RUN_GUIDE.md

6、按照提示在Xcode中打开RUNNER.xcworkspace,但提示错误Command PhaseScriptExecution failed with a nonzero exit code,Cursor检查后表示是因为未安装CocoaPods(iOS开发必须的依赖管理工具,Flutter的iOS插件需要通过它来管理),虽然它给出了解决方案,我还是希望Cursor能帮我安装,但未能实现,可能是卡在权限或者无法连接GitHub的资源上了?

7、可能还是需要通过终端命令的形式来安装,Cursor给出的步骤如下,中途切换了一下网络,第一步就无法直接下载

1.安装 Homebrew(如果还没有)

/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”

这一步中途切换了下网络,不然无法下载,但依然卡在了“Downloading Command Line Tools for Xcode 26.1”,搜索发现这还不是个例,网上有不少教程都建议这里手动去苹果开发者网站下载安装,然后重新运行这个命令

2.安装 Ruby 和 CocoaPods

brew install ruby cocoapods

第一步完成之后需要关掉终端,重新打开之后再输入这一命令,不然会提示zsh: command not found: brew

3.安装 iOS 依赖

cd /Users/jinlei.wu/Documents/GitHub/ChatWith/chatwith_flutter

cd ios

pod install

cd ..

4.在 Xcode 中打开

open ios/Runner.xcworkspace

8、在上面第三步就卡住了,多次调整后依然无法在Xcode中正常构建,明明CocoaPods已经安装并且可以查到版本号了,但仍然频繁出现构建失败的情况,Cursor建议优先使用Flutter命令运行应用,但也无法运行,提示找不到设备:

cd /Users/jinlei.wu/Documents/GitHub/ChatWith/chatwith_flutter

export PATH=”$PATH:/Users/jinlei.wu/Documents/Dev/flutter/bin”

flutter run -d “iPhone 16”

9、很奇怪的一点是,不知道为啥,Cursor给我创建了大量的.md说明文档和.sh安装脚本文件,而不是像之前那样直接进行修改操作,明天打开一个新对话,再让Cursor继续修复问题,并且看看这些.md和.sh文件是否有必要保留