DevLog:2026年1月6日

1、继续测试使用Flutter重写的ChatWith for Mac,还有很多问题需要修改,先修改这几处:

1.把右上角的搜索按钮挪到最左侧,放在“对话”上面

2.明确对话列表、收藏列表的显示规则,对话列表中,标题是用户提出的最后一个问题,下面小字显示最后一次回答的内容,只显示一行,收藏列表中,标题是收藏的回答对应的问题,下面小字显示收藏的回答内容,只显示一行

3.对话列表和收藏列表的宽度都固定为300,且不需要拖动调整

4.应用最顶部标题栏的chatwith改成ChatWith

2、上述问题1、2、3均已修改,问题4仍未修改,而且还存在如下问题,继续修改

1.顶部居中显示的ChatWith没有用,可以去掉

2.每次打开应用时窗口大小都会回到初始值,没有保存上次打开时对窗口大小的调整,还需要手动调整一下

3.简化一下设置界面,第三列即设置详情的顶部,需要去掉AI模型管理、外观设置、数据统计、回收站这些标题

4.添加和修改模型时,底部的高级设置展开后显示不全,并且有一条多余的分割线,可以去掉

3、继续修改一些界面上的小问题,之后重点测试对话流程,比如切换模型对话、联网搜索功能等等

1、左上角搜索按钮,鼠标划过时不需要显示提示,并且划过时的背景大小要和下面的对话、收藏、设置按钮背景大小一致,在搜索按钮下方增加“搜索”二字,与其他三个按钮样式保持一致

2.去掉对话列表顶部的“新建对话”按钮,去掉收藏列表顶部的“新建收藏”按钮

3.About chatwith界面的应用名是哪里规定的?可否改成ChatWith?

4.每条AI回答内容的底部除现有的收藏、复制按钮外,增加一个删除按钮

4、Cursor修改之后,上面2、3、4都已经OK,但是1鼠标在划过时显示成了方形的背景,而非划过对话、收藏、设置按钮时的圆角矩形按钮,继续修改,并且给最左侧导航栏顶部添加了8像素的间距,不再紧贴顶部

5、收藏界面打开一条收藏后,列表顶部的分割线和收藏详情顶部的分割线没有对齐,让Cursor把收藏详情顶部的“编辑”和“复制”按钮改成和对话详情顶部的“新建对话”按钮一致的样式,虽然仍然没有完全对齐,但相比之前已经美观很多了

6、继续修改对话和收藏页,首次打开应用时对话界面虽然有空状态提示,但没有新建对话按钮,还需要把刚才删掉的对话列表顶部的“新建对话”按钮加回来,同时右侧详情页顶部的模型切换按钮、新建对话按钮,即使未打开任何对话,也要一直显示;针对收藏页,收藏列表顶部的“新建收藏”按钮也加回来,如果没有打开任何一条收藏,右侧详情页顶部就只显示一个“新建收藏”按钮,如果打开了任何一条收藏,右侧详情页顶部就显示“编辑”和“复制”按钮,这样修改之后对话和收藏页面的列表、详情页分割线就对齐了

7、接下来给收藏详情页底部增加一行信息栏,打开一条收藏后,可显示该条收藏的添加时间、修改时间(最后一次修改的时间)、字数统计三个信息;然后在对话详情页,需要给每条消息增加时间信息,显示在消息下方,Cursor先使用了比较复杂的相对时间(近期)+完整日期时间(较早的日期)的方式,今天的时间只显示时分,昨天的时间显示为昨天+时分,一周内的时间显示为几天前,更早的显示为完整日期时间,貌似这也是苹果设备上的应用比较常用的时间显示方式

8、然后把回收站的收藏和对话换个顺序,左边是已删除的对话,右边是已删除的收藏,到此,对于应用界面的首轮修改就差不多了,备份了之前使用Swift写的ChatWith for Mac,然后清理了对应的文件、刷新了README.md文档

9、接下来开始对各项功能进行测试和完善,在对话过程中发现如下问题,先集中修改一波:

1.新建对话时,有时会出现这样的问题:新对话在列表里会显示和上一个对话一样的标题和副标题,再次新建对话才会以“新对话”为标题

2.启用联网搜索功能后,联网搜索结果的显示需要优化,我只需要看到标题-网站名和来源链接,不需要从中摘取的内容,并且这些链接我需要可以点击,点击后直接用默认浏览器打开

3.对话列表的置顶功能有问题,比如我将对话A和B都置顶,再取消对话A的置顶,这时应该只有对话B置顶,但实际使用时却是对话A置顶,对话B被取消了置顶,并且置顶的对话应该有个区别于非置顶对话的底色,可以对比下收藏列表的置顶功能,收藏列表的置顶功能正常

4.对话列表和收藏列表,都应当支持用户修改标题(点击标题后面的三个圆点,菜单里需要有置顶/取消置顶、修改、删除三个功能,在在现在的基础上增加“修改”功能),如果用户修改了标题,就一直用用户修改的标题,如果没有修改,就沿用之前的标题获取逻辑

10、修改后测试,构建失败,问题:The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation.原因在于刚刚为了实现参考链接可点击的功能,添加了url_launcher依赖,需要重新安装Pods以包含新的macOS插件(url_launcher_macos),否则就会出现Podfile.lock与实际的Pods目录不同步的问题,修改之后解决

11、再次测试,其他问题基本都已修正,还需要继续进行一些优化:对话列表可能存在刷新机制的问题,对标题进行修改、置顶/取消置顶、新建对话等操作后,列表有时不会立即刷新;联网搜索功能参考的链接需要增加到10个,5个链接可能参考性不足;AI回答内容背景的灰色太深了,需要浅一些

12、再次测试,发现对话列表的刷新机制还是有点问题,比如AI正在回答时,对话列表就会频繁刷新,其实不需要,让Cursor改成了回答结束后刷新对话列表,但发现在联网搜索过程中和回答过程中还是在频繁刷新,于是和Cursor明确:在联网搜索过程中也不要频繁刷新,只有回答结束后、置顶/取消置顶后、修改标题后、创建新对话后 这几种情况下才触发对话列表的刷新操作,再次修改后对话列表仍然会在AI回答过程中频繁刷新,这个问题后面再开一个新对话再修改

13、继续测试应用的功能,接下来是收藏模块,首先收藏的内容比较长时,收藏详情底部会出现“BOTTOM OVERFLOWED BY XXX PIXELS”这种提示,并且无法滚动查看,只有在点击编辑后才能滚动查看,修改过程中将非编辑模式下的MarkdownBody包裹在SingleChildScrollView中,使内容可滚动,问题已解决

14、发现新问题,有些回答内容中就会带一些文字形式的链接,但只显示为蓝色文字,无法打开,我需要让这些链接也像Tavily提供的参考链接那样可以直接点开,在回答内容、收藏内容都是如此,都要点击可以直接点开,为实现这一需求,针对AI回答内容中的链接,Cursor给MarkdownBody添加了onTapLink回调,点击链接时使用url_launcher在默认浏览器中打开,并且添加了链接样式,针对收藏内容中的链接,Cursor导入了url_launcher包,并为MarkdownBody添加了onTapLink回调,实测问题已解决

15、对话和收藏删除之后,回收站里第一条内容和分割线之间没有任何间距,需要稍微增加一点间距(可以用第一条和第二条之间的间距),视觉上更好一些,针对这一问题,Cursor给第一条删除的内容和TabBar分割线之间增加了8像素的间距,与列表项之间的间距一致,视觉上更统一了

16、还有,数据统计界面的收藏、对话、模型三个图标颜色有些突兀,需要改一下,针对这种比较模糊的需求,Cursor将Colors.red、Colors.blue和Colors.purple改成了Colors.pink.shade300、Colors.blue.shade300和Colors.grey.shade300,认为这些颜色比较柔和,与界面更协调,再次构建看效果,的确比之前要好些了

17、AI模型管理界面,每个模型卡片的整体高度需要稍微缩减一下,稍微紧凑一点点,现在每个卡片的高度都比较高,默认窗口大小的情况下只能显示两三个模型,Cursor同步修改了卡片内边距、标题字体大小、垂直间距、文字大小、按钮尺寸等等,显示效果好多了

18、然后调整数据统计界面的卡片间距,之前间距过大,要求统一成8,但视觉上还是很大,可能每个卡片上下各有8的间距?另外还需要增加已删除的对话、已删除的收藏 两个数据统计卡片,图标颜色用灰色,整体顺序用:AI模型数量、对话数量、已删除对话数量、收藏数量、已删除收藏数量,再次构建测试,需求已达成,今天到此结束

DevLog:2026年1月5日

1、年前对目前的项目进行了盘点,暂定先主要推进ChatWith移动端(已使用Flutter重写)和ChatWith for Mac的开发工作

2、针对ChatWith for Mac,节前要求Cursor进行了微调,以实现“所有网络请求必须在后台线程执行,所有UI更新操作必须在主线程执行”的需求,今天起对应用进行测试,主要看是否还会在切换对话时遇到卡死问题,已经去掉了在对话中切换模型的功能,如果测试没有什么明显的问题就修改设置-关于页面、刷新README文档,并打包,版本号用v0.3

3、对比Chatbox,有几个功能后面还是要加上,比如上传图片、上传文件并由AI进行解读,这两个功能留到后面v0.5时再添加

4、接下来调整一下UI,特别是输入框,目前应用的输入框看不到边框线,且右侧的联网搜索和发送/停止按钮大小不一样,要求Cursor给对话界面的输入框增加灰色边框线,并修改联网搜索按钮,去掉已关闭、已开启的文字,只留图标

5、输入框和按钮的修改基本完成,但总感觉发送/停止按钮和联网搜索按钮大小不一样,且在测试时再次遇到了应用卡死问题,从调试信息来看,对话的输入和输出是正常的,但没有看到UI更新,继续反馈问题给Cursor,修改一次之后卡死问题更加严重,只要打开应用-打开历史对话就会卡死,再次反馈、修改

6、目前打开应用-打开历史对话暂时不会卡死了,但在翻看更早的历史对话消息时又会卡死,要求Cursor添加调试信息来定位问题,同时还询问了豆包,豆包认为所有的耗时操作都不应该放在主线程执行,比如网络请求(之前已经挪到了后台线程)和本地数据读写(涉及DataManager和MessageView等文件),修改之后Cursor指出,虽然Core Data的保存操作必须在主线程执行,但由于使用了异步执行,不会阻塞调用线程

7、再次测试,仍然会出现卡死问题,逐渐失去耐心了,询问豆包,换用 Flutter 完全可以从根源上解决这类卡死问题,且Flutter对「消息列表加载/渲染」的适配性远优于原生Swift,99%的原生卡死场景在Flutter中都能彻底规避;更关键的是,Flutter无需像原生那样做大量「线程切换、异步处理」的繁琐适配,基础写法就自带防卡死能力,开发效率更高

8、开启了一个新对话,决定在新对话中先梳理目前应用的功能,并且用Flutter来重写当前应用,步骤包括创建Flutter项目结构和基础配置、创建数据模型、实现数据层、实现AI服务层、实现视图模型、创建主界面、实现AI对话视图、实现收藏视图、实现设置视图、实现搜索视图、检查并完善所有模型类等等,耗时大概50分钟,中间还中断了一次,点击继续之后Cursor首先查可能了已有文件,了解进度,并逐步完成剩余部分

9、使用Flutter的项目结构包含models-数据模型、services-服务层、viewmodels-视图模型、views-UI视图,之后让Cursor生成了该应用的的macOS平台代码,并且在生成ephemeral文件,并修复编译错误、图标问题后,项目成功构建

10、使用Flutter构建的应用界面稍显简陋,主要的功能板块已经有了,包括对话、收藏、设置三个页面,设置中包含了AI模型管理、外观设置和数据统计,但每个界面右上角都带了一个DEBUG的标志,不知道是干啥用的,先让Cursor去掉它(debugShowCheckedModBanner),同时也问问能否把之前已有的图标文件复制过来一份,继续使用(将Swift版本的图标复制到Flutter版本,并重命名为Flutter所需的文件名格式)

11、修改过程中再次出现了频繁创建.md说明文件的情况,其实我用不到,要求Cusor清理掉

12、目前ChatWith for Mac已经实现了基于Flutter的改写,并且可以成功构建,接下来需要对各个功能进行详细测试和修改,目前已发现的问题包括:

1.在添加和修改模型时,我需要让添加和修改窗口在最前,只有点了取消或确定后才能回到主界面,现在只要一点主界面,添加和修改窗口就会被关闭

2.对话时,点击发送按钮后问题发不出去,没有任何反应

3.设置-外观设置-主题模式中,我需要跟随系统、浅色模式、深色模式三个选项,并且点击选项后可实现对应的主题模式

4.需要增加回收站功能(删除和恢复对话和收藏)和搜索功能(搜索对话和收藏)

5.设置-AI模型管理界面,需要增加删除模型按钮

13、初步修改了一轮之后,发现上面的五个问题里,

1.已解决

2.未解决,发送按钮有时可用有时不可用

3.已解决

4.需要把回收站挪到设置页的数据统计下边,即设置界面共有AI模型管理、外观设置、数据统计、回收站四个功能

5.未解决,AI模型管理界面还是没有删除模型按钮

14、继续修正问题2和问题4,问题2通过添加输入框监听器和_cansend状态变量,已完成修改,问题4主要是在entitlements文件中添加了com.apple.security.network.client权限,允许应用进行网络请求,已完成修改,并且在测试过程中发现之前使用Swift实现的深度思考、流式输出等功能均可正常使用

15、继续修正问题5,通过移除if(config.isCustom)条件判断,改为每个模型后边都会显示删除按钮,解决了问题

16、明天继续修改其他问题,包括:

1.把右上角的搜索按钮挪到最左侧,放在“对话”上面

2.明确对话列表的显示规则,标题直接用用户提出的最后一个问题,下面小字显示最后一次回答的内容,只显示一行

3.对话列表和收藏列表的宽度都固定为300,且不需要拖动调整

4.其他问题视测试情况而定

DevLog:2025年11月4日

补充一条,时间线有点乱了,但还是要记录一下。

1、继续试用ChatWith,发现目前的应用在使用支持深度思考的模型时,思考内容好像限制了显示高度,一旦达到高度限制,就不会随着思考的内容继续自动滚动,Cursor表示思考内容的显示高度的确固定在了400点,且超出之后会出现滚动条,但超过400点后就不会再自动滚动,在修改过程中发现了另一个问题,好像在对话中切换了另一个模型,再提出新问题时应用就会卡死

2、Cursor分析了可能导致应用卡死的几个问题:Core Data并发冲突、通知监听器生命周期、状态读取时序、缺少状态同步,特别是Core Data并发冲突,由于直接在主线程修改Core Data managedobject,如果此时用户立即发送消息,可能造成并发访问冲突,updateAISession可能触发Core Data save操作,与其他操作冲突,明天继续修改这个问题

3、添加其他模型来测试Base URL的填写方法,之前已经要求Cursor将其改为用户手动填写AI服务的跟地址,应用会自动补全路径,比如api.openai.com、openrouter.ai/api,然后针对火山引擎的“应用”(bots)做了特别优化,需要填写完整地址https://ark.cn-beijing.volces.com/api/v3/bots/,测试发现百度云千帆的Base URL填写仍然有问题,比如我填写官网提供的https://qianfan.baidubce.com/v2/chat/completions就会连接失败,删掉v2往后的内容也不行,只填写https://qianfan.baidubce.com也不行,与其设定各种复杂的自动补全规则,倒不如直接要求用户填写完整的Base URL,或者应用内置一些常用的Base URL来的简单

附上常用的几个AI的Base URL:

OpenAI

https://api.openai.com/v1/chat/completions

DeepSeek

https://api.deepseek.com/v1/chat/completions

OpenRouter

https://openrouter.ai/api/v1/chat/completions

硅基流动

https://api.siliconflow.cn/v1/chat/completions

火山方舟

https://ark.cn-beijing.volces.com/api/v3/chat/completions

https://ark.cn-beijing.volces.com/api/v3/bots/chat/completions

百度云千帆

https://qianfan.baidubce.com/v2/chat/completions

阿里云百炼

https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

4、询问Cursor目前应用在Base URL补全方面的规则是怎样的,根据回答内容,规则包括:

1.如果没有http://或https://,就自动添加https://

2.如果URL末尾有斜杠,就自动移除

3.如果已经包含完整路径,就不做任何修改

4.如果包含部分路径,就自动补全,比如补全v1,补全/chat/completions

5.如果只有基础URL,就自动补全/v1/chat/completions

按照这套规则,我填写了完整的百度云千帆的Base URL,应该能正常使用才对,但填写完整地址之后测试仍然提示404

5、问题可能出现在自动补全v1上,也就是在“包含/chat/completions但不包含v1时,会自动添加v1前缀,包含/api/、/bots/、/v3/、/v2/,且不含/chat/时,则添加chat/completions”这里,根据Cursor给出的示例,可能会出现/v1出现在/chat/completions之后的情况

6、目前的规则的确有些复杂,可能用户在填写过程中也会不知道该填写完整的地址还是部分地址,倒不如直接在应用里内置几个常用的、完整的Base URL,由用户自行选择,要求:目前的规则有些复杂,我希望能在添加和编辑AI模型界面,预置几个常用的API平台的完整Base URL,用户只需要填写备注、模型名称、选择模型提供商、填写API Key、填写Tavily API Key即可使用模型

7、Cursor在修改过程中创建了APIProvider枚举,包含10个常用平台(OpenAI、DeepSeek、Anthropic Claude、OpenRouter、Google Gemini、智谱GLM、月之暗面Kimi、百度文心一言、阿里通义千问、腾讯混元、自定义),这样就不再需要配置路径补全规则,用起来也更方便了,先添加几个模型试试,再决定要不要增加或删减APIProvider

8、在修正因为使用中文引号导致构建失败的错误之后,百度云千帆和火山方舟的API都可成功连接,当API提供商选择自定义时,需在“高级设置”的Base URL中填写完整地址,即带有/chat/completions的地址

9、APIProvider需要增加硅基流动、火山方舟、百度云千帆、阿里云百炼,这四个都放在“自定义”前面,另外我发现在选择某个APIProvider之后,模型名称部分也会出现预置的模型名称,但我不需要,改成由用户手动填写模型名称,修改之后测试了几个不同的模型,都可以成功连接了

DevLog:2025年12月19日

1、测试当前版本的ChatWith for Mac,目前已经支持在打开应用后自动开启新对话,并且新对话位于置顶对话下方,之前已经要求应用在开启新对话时默认使用模型列表里的第一个模型,并且在对话过程中也可以点击右上角切换模型,但由于多次遇到切换模型后对话界面卡死的情况(也有可能是在加载历史对话时出现卡死?),决定调整模型切换的逻辑试试

2、首先,在AI模型管理界面,增加“默认模型”设置,按钮放在每个模型的“测试”按钮前面,可以将任何一个模型设置为默认模型,并且在创建新对话时直接使用默认模型,若用户需要使用其他模型,就在AI模型管理界面手动切换默认模型,再去开启新对话,这样也能防止某个对话中积累太多内容

3、另外我还发现现在每次在应用的不同界面间切换时都可能触发“创建新对话”的操作,比如首次启动应用时会创建新对话,看看收藏界面,再回到对话界面,也会创建一个新对话,这样就导致会出现多个空白的新对话,我只需要在首次启动应用时创建新对话,并且如果已经有空的新对话,就不要再自动创建新对话了

4、或者去掉自动创建新对话的机制,但在对话界面增加一个提示,比如请点击开启新对话,与默认模型对话,需要看下这种方式是否和目前的空状态提示有冲突

5、综上,本次修改内容包括:

1.在AI模型管理界面,增加“默认模型”设置,按钮放在每个模型的“测试”按钮前面,可以将任何一个模型设置为默认模型,并且在创建新对话时直接使用默认模型

2.去掉每次打开应用自动创建新对话的机制,在对话界面最右侧栏增加一个提示“请点击右上角开启新对话,若需切换模型,请前往设置中修改默认模型”

6、Cursor的修改内容包括:在DataManager中添加默认模型ID的保存和读取方法(使用UserDefaults);在AIModelManagementView中添加“默认模型”按钮(放在“测试”按钮前面);修改AIViewModel的createNewSession方法,使用模型模型而不是第一个模型;修改AIChatView的sendMessage方法,使用默认模型;去掉AIChatSessionListView中的自动创建新对话逻辑;在AIChatView的emptyChatView中添加提示信息,除此之外还增加了一条“更新removeAIConfig方法:删除的模型时默认模型时,清除默认模型设置”

7、测试发现默认模型设置功能已经具备,创建新对话时会直接使用新模型,但对话界面右侧的提示目前有两行,并且内容有重复,于是让Cursor去掉了第一行,只留新添加的一行,并且稍微加大了提示内容的字号

8、本次的修改需求基本达成,发现AI模型管理界面的“数据统计”功能好像没啥用,于是也让Cursor去掉了,至于在使用应用的过程中频繁出现的FSFindFolder failed with error=-43错误提示,Cursor认为这种提示通常出现在CoreData初始化时,系统内部可能使用旧的Carbon API(FSFindFolder)查找Application Support目录,导致出现了-43即“文件未找到”错误,Cursor改成了显式指定Core Data存储位置,使用FileManager的现代API,避免系统使用旧的FSFindFolder API,初步测试暂时未遇到这一错误

9、今天的修改就到这里,接下来测试两天,如果没有什么明显的问题就修改设置-关于页面、刷新README文档,并打包,版本号用v0.3

DevLog:2025年12月17日

1、总结一下当前五个应用的进展和问题:

ChatWith移动端:已使用Flutter重写,仍在测试与补充功能阶段,需要尽快完善功能并打包,通过TestFlight上线测试版

NoteWith移动端:使用原生Swift编写,已经引入MarkdownUI和RichTextKit来解决AI对话内容渲染和备忘录模块的富文本编辑器功能,仍在测试与补充功能阶段

ChatWith Mac端:使用原生Swift,由ChatWith移动端改写(或者是NoteWith移动端改写?记不清了)改写,目前功能基本达成需求,并且已经打包两个版本,主要问题在于在不同对话间切换/在对话中切换模型时偶发应用卡死的问题

NoteWith Mac端:使用原生Swift,和ChatWith类似,由NoteWith移动端改写,仍在测试与补充功能阶段

DoitWith移动版:只有Todo相关的功能,比较简单,仍在测试与补充功能阶段

2、ChatWith移动端的核心功能跟NoteWith移动端其实是基本一致的,ChatWith Mac端和NoteWith Mac端的核心功能也基本一致,重复开发和测试增加了不小的工作量,且目前没有想好要怎样实现NoteWith双端的AI对话和备忘录两个模块间的联动,至于DoitWith,同类型的应用非常多,还没有想到能有什么创新点,先暂时搁置,集中精力推进ChatWith移动端和ChatWith Mac端的开发工作

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月12日

1、昨天给使用Flutter重构的ChatWith增加了多模型管理和切换、联网搜索、回收站、深度思考等等,添加OpenRouter的Claude 3.7 Sonnet和硅基流动的DeepSeek-R1试试看,首轮测试问题如下:

1.在添加/编辑模型页,目前“模型名称”和“模型”两个字段都是必填,如果作用一样的话,可以去掉“模型”字段

2.模型管理页,不需要显示太多内容,可以去掉这里的Base URL,只保留“模型名称”和“备注”字段

3.模型管理页,每个模型前边都有星号,但点击星号无法设置为默认模型,而是进入了模型编辑页,我需要在点击星号时将其设为默认模型,再次点击取消默认

4.点击对话界面上方的按钮,可以切换模型,想再次切换时就会显示“加载中”,看不到我添加的其它模型

5.对话时,AI返回的内容是乱码

6.创建新对话后,仍然使用了我在上次对话时切换的模型,想切换其他模型就会显示“加载中”,看不到我添加的其它模型

2、全部反馈给Cursor进行修改,去掉了“模型”字段,包括“模型名称”会作为model字段的值保留,模型管理页简化显示,点击星号设置默认模型,并且可切换实心空心,修复模型选择器加载问题,使用watch正确监听模型列表变化,使用utf8.decode()正确解码响应流,新对话使用默认模型,再次测试,上面提到的问题1、2、3、5均已修复,但在对话中切换模型时依然会显示“加载中”,看不到我添加的其它模型

3、决定简化对话页的逻辑,并做更多修改如下:

1.创建新对话时即使用默认模型,仅在对话窗口上方显示当前的默认模型,不需要在这里切换模型

2.去掉对话列表和收藏列表右上方的“设置”按钮,将“设置”改成应用底部的第三个Tab

3.设置页顶部的“设置”二字居左显示,和对话列表页顶部的“全部对话”保持一致

4.收藏页顶部的“收藏夹”三个字居左显示,和对话列表页顶部的“全部对话”样式一致

5.与支持深度思考的模型(如DeepSeek R1)对话时,看不到思考过程,是否需要增加一个判断模型是否支持深度思考的功能?如果支持就展示思考过程

6.AI对话内容的字号调小一点,现在有点大

4、Cursor陆续实现上述需求,创建了ModelDisplay组件,在对话窗口只显示当前的默认模型名称,移除了模型切换功能,在AIModel中添加了supportsThinkinggetter,通过模型名称判断是否支持深度思考,目前的判定逻辑是包含r1、o1、deepseek、thinking等关键词,但我觉得可能不是很合适,后面还得再优化,然后把Markdown样式中段落字号从16调整为14,再次测试,果然在与DeepSeek R1对话时仍未显示思考过程,且对话页、收藏页、设置页三个页面的标题目前均为居中,继续反馈问题并增加更多需求:

1.在与DeepSeek R1对话时仍然未能显示思考过程,可能通过模型名称来判断是否支持深度思考并不是很合适,有没有其它更好的判定方法?或者在添加/编辑模型页增加一个是否支持深度思考的选项?如果选择了支持,就在对话时展示思考过程,如果选择了不支持,就不展示思考内容,这两种方式你更推荐哪一种?(先回答我这个问题,不要直接修改,后面问题2到问题6请直接修改)

2.对话页、收藏页、设置页三个页面的标题(全部对话、收藏夹、设置)目前均为居中,我需要统一成居左显示

3.对话列表里的标题显示用户提出的最后一个问题,下面的小字显示AI最后一次回答的内容,都只显示一行

4.对话详情页,用户和AI都需要有一个头像,并且在消息下方显示消息时间

5.调整一下设置页的“数据管理”,点击“数据统计”,打开新页面,可在新页面里查看AI对话、收藏内容的数量,并且也在“数据统计”前增加一个图标,和“回收站”入口的样式一致

6.在设置页,把外观设置挪到最下方,设置页共三个模块:模型管理、数据管理、外观

5、关于上面的第一个问题,Cursor更推荐在添加/编辑模型页增加“是否支持深度思考”选项,这种方式不依赖模型名称的命名规则,用户可手动控制,模型名称变化不影响判断,用户明确知道哪些模型支持,决定采纳建议,并进一步明确如下:

在添加/编辑模型页增加“是否支持深度思考”选项,默认选中“不支持”,用户可自行选择,同时在模型管理页,每个模型的信息中增加一行,根据用户的选择情况显示“支持深度思考”或“不支持深度思考”

6、让Cursor实现上述需求,修改过程中重写了chat_message_item.dart文件,可能是多次修改导致结构出现了问题?完成之后再次测试,对话详情页已支持对话双方的头像,设置页已基本符合需求,回答内容的流式输出正常,Markdown渲染正常

7、但是,对话页、收藏页、设置页三个页面的标题仍然是居中显示(第二次修改仍然无效),对话列表里每个对话只能看到最后一个问题,看不到最后一次回答,即使我给硅基流动的DeepSeek R1打开了支持深度思考,好像仍然不显示思考过程,需要再用其它问题试一下

8、另外还需要补充的功能包括触发联网搜索、显示联网搜索的参考链接、测试模型是否可用、对话的置顶/修改/删除功能(已有按钮,需测试是否可用)

9、使用Flutter创建的应用,在界面上整体明显更偏向原生安卓的风格,毕竟谷歌出品

DevLog:2025年12月9日

1、昨天在使用Flutter重写ChatWith时,一直无法成功构建,即使用Cursor提供的终端命令也无法打开应用,同时在修改过程中,Cursor给我创建了大量的.md说明文档和.sh安装脚本文件,只是在告诉我应该怎么做,而不是像之前那样直接进行修改

2、打开一个新对话,再让Cursor继续修复Xcode报的问题,并且看看这些.md和.sh文件是否有必要保留,于是询问Cursor:我之前用Flutter重写了这个应用,但一直构建失败,提示:Command PhaseScriptExecution failed with a nonzero exit code,并且在重写过程中,文件夹里多了很多.md和.sh文件,这些文件是否可以删除?

3、Cursor修复了构建失败的问题,认为构建失败不是因为PhaseScriptExecution脚本问题,而是代码编译错误,包括Message类问题、CardTheme类型错误、类型声明错误、缺少导入等,然后清理了.md和.sh文件共23个,然后在Xcode中尝试构建,竟然真的构建成功了

4、但是出现了很多的错误提示,基本都是Stale file ‘/Users/jinlei.wu/Documents/GitHub/ChatWith/chatwith_flutter/build/ios/Debug-iphonesimulator’ is located outside of the allowed root paths.,看这个提示信息,像是这个文件的路径错误?Clean Build Folder后解决,并且可以成功构建

5、决定让Cursor删掉/Users/jinlei.wu/Documents/GitHub/ChatWith/目录下使用Swift原生构建的应用,只保留使用Flutter构建的应用

6、继续构建并测试功能,首先就是点击右上角的设置按钮,设置界面里是空白的,提示“错误:Exception: SharedPreferences not initialized”,所以也没有办法添加模型,测试对话等一系列功能,Cursor认为问题原因在于preferencesStorageProvider是同步provider,但依赖异步的sharedPreferencesProvider,当SharedPreferences尚未初始化时,preferencesStorageProvider会抛出“SharedPreferences not initialized”异常,修复之后重新生成了代码,现在可以看到设置界面了,以后再添加模型试试能否正常使用

7、这几次构建测试,总觉得应用启动速度好慢,后面还需要给应用增加多模型管理和切换、联网搜索、回收站、深度思考、流式输出、Markdown渲染等功能,又是一个不断增加功能、测试功能的过程

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文件是否有必要保留

DevLog:2026年12月5日

1、昨天引入RichTextKit,替换了目前的备忘录模块,但依然未能正常进行构建测试,在Xcode中构建时发现存在两处错误,再次反馈给Cursor并修改后构建成功

2、测试发现目前的确已经可以实现富文本编辑器的部分功能,比如设置加粗、下划线、删除线、文字颜色、字体、对齐方式,但工具栏中的斜体、字号大小,还有一个不知道是啥按钮,点亮和取消都没有看到什么变化,而且需要先选中文字,再从菜单里选“Format——More”才能在窗口底部弹出格式工具栏,感觉不够直观,需要缩减菜单层级

3、反馈后Cursor把工具栏改成了常驻在标题和编辑器之间,但在Xcode中多次构建都存在错误,猜测可能是Composer 1模型的问题?于是把Cursor中的模型切换回了Auto再试,但在修改过程中又把格式工具栏给我改回了自定义的NSAttributedString,测试发现其中的按钮基本都没有用,于是要求Cursor用RichTextKit内置工具栏RichTextFormat.Toolbar替换自定义实现

4、这下RichTextFormat.Toolbar常驻在备忘录详情页的标题和编辑器之间了,但格式工具栏高度有些夸张了,我希望能把第一行(包含加粗、斜体、下划线、删除线、字号)常驻,其他按钮先折叠起来,在第一行按钮后方增加一个向下的箭头,点击可以展开完整的工具栏

5、Cursor在使用RichTextContent的API、RichTextStyle枚举、RichTextAction,并保持与RichTextKit的兼容性的同时,实现了我的需求,工具栏默认折叠,只显示第一行常用按钮,点击箭头可以展开更多选项,效果还可以

6、接下来添加一个支持深度思考的模型,测试思考内容的流式输出和展示是否正常

7、插播另一个话题,在使用Cherry Studio询问“有哪些比较好用的跨端开发框架”时,发现使用Cherry Studio调用百度千帆平台的DeepSeek API时,响应速度和回答速度都非常慢,回答一个问题可能需要四五分钟的时间,但直接调用DeepSeek官方的API就没有问题,看了下我在百度千帆上的费用还有47块多,消耗的速度好慢

8、说到跨端开发框架,DeepSeek推荐用Flutter,支持iOS、Android、Web、桌面(Windows/macOS/Linux),高性能、重热载、组件库丰富、生态强大,缺点在于需要学习Dart语言(有Cursor,这个不算缺点)、包体积较大、Web端体验较差(无所谓,我也没打算上Web端),看起来的确是最符合我需求的跨端开发框架

9、之前移动端的ChatWith一直无法全屏显示,多次修改也无果,决定就用它开刀了,看能否在Cursor里使用Flutter框架,把它改成跨端应用,先搞好iOS端,再搞Mac端

10、询问Cursor如果我想把ChatWith改成用Flutter框架的话,可行性如何,Cursor认为目前应用的功能在Flutter中均可实现,核心功能在Flutter中均有对应的方案,我比较关注本地存储和Markdown渲染,本次存储上,Cursor建议对话数据用sqflite数据库,配置用shared_preferences,Markdown渲染用flutter_markdown或markdown_widget,且Flutter的Markdown包更成熟,但是,需要完全重写,无法复用Swift代码

11、Cursor还推荐了如下技术栈:

核心框架:Flutter SDK(最新稳定版)

状态管理:Provider或Riverpod(推荐 Riverpod)

网络请求:dio(支持流式响应)

本地存储:shared_preferences (配置)、sqflite (对话数据)

Markdown渲染:flutter_markdown

UI组件:cupertino_icons (iOS风格图标) 、flutter_slidable (滑动操作)

并且推荐完全迁移,优点在于跨平台、长期维护成本低,缺点在于需要重写所有代码

12、继续询问,如果按照Cursor的建议完全迁移,并使用Cursor推荐的技术栈的话,让它分析了一下详细的迁移计划和项目结构建议,它直接写了三个文档:FLUTTER_MIGRATION_PLAN.md(迁移计划)、FLUTTER_CODE_EXAMPLES.md(代码示例)、FLUTTER_QUICK_START.md(快速开始),可能Cursor认为我自己会参考这三个文档来开发吧,先这样,接下来让Cursor来进行迁移