Skip to content

Release 1.4.0+1

Choose a tag to compare

@LimoYuan LimoYuan released this 13 Jul 14:35
· 3 commits to main since this release

Cloudreve4 Flutter v1.4.0 Release Notes

发布日期: 2026-07-11
上一版本: v1.3.0_3_pr2


🎉 重磅更新

本次更新自 v1.3.0_3_pr2 以来累计大量提交,新增了 Rust 高性能同步引擎Windows Cloud Filter / Linux FUSE 镜像挂载QR 码扫码登录桌面端深度增强桌面端同步向导文件管理器 UI 大重写 + 分页排序PDF 预览菜单品牌定制构建应用内自动更新上传/下载任务持久化迁移 drift + 分页加载等大量重磅功能,并修复了海量 Bug。


✨ 新功能 (Features)

🦀 Rust 同步引擎 (Sync Core)

全新引入基于 Rust 编写的高性能文件同步引擎 sync-core,通过 flutter_rust_bridge (FRB) 与 Dart 层通信,提供双向同步能力。

  • 多种同步模式
    • 全量同步 (Full):双向同步,支持 6 种冲突策略 (keep_both/keep_local/keep_remote/newest_wins/largest_wins/manual)
    • 仅上传 (UploadOnly):本地→远程单向
    • 仅下载 (DownloadOnly):远程→本地单向
    • 相册同步 (AlbumUpload / AlbumDownload):Android 专属,备份 DCIM/Camera
    • 镜像同步 - Windows Cloud Filter (MirrorWcf):占位符 + 按需水合
    • 镜像挂载 - Linux FUSE:按需水合 + 读写挂载
  • 核心特性
    • 三路差异算法(本地 vs 远程 vs DB)
    • SSE 远程事件订阅 + notify 本地文件监听 + 500ms 事件防抖
    • 上传/下载分块写入降低内存占用,Semaphore 并发控制 + 带宽限速
    • 同步配置热更新(冲突策略/并发数/Token 实时推送)
    • 同步状态/配置持久化,启动自动恢复
    • 完整事件统计与任务列表展示(含失败计数)
    • 支持暂停 / 恢复 / 停止 / 强制重新同步 / 重置同步(清空 DB + 本地目录,绝不碰远程)
    • 同步日志级别热修改(Trace/Debug/Info/Warn/Error),输出到独立 sync_core/logs/
  • 软暂停 / 恢复机制
    • pause_token 区分用户暂停与停止;resume 后台重跑差异扫描
    • 下载 / 上传可中断:shutdown_token + pause_token 接入,新增 stream_to_file_cancellable 续传
    • WorkerStatus 新增 Paused 变体

🔄 同步向导 / 入口

  • 桌面端同步向导desktop_sync_wizard_page,含软强制门禁(首次进入 / 未配置时引导完成)
  • 移动端同步入口mobile_sync_entry_page,与桌面端共享配置语义

🪟 Windows Cloud Filter API (CFApi) 镜像同步

Windows 专属——通过 CFApi 创建占位符,文件按需从云端水合下载。

  • 仅同步元数据,本地零空间占用
  • 双击/读取时自动水合下载
  • 两种删除策略:仅删本地(保留远程) / 同步删除远程
  • 完整的 WorkerPool 集成,水合/占位符/删除等操作均纳入统计

🐧 Linux FUSE 读写挂载

Linux 专属——基于 FUSE 实现的镜像挂载文件系统。

  • 按需水合,文件读取时从云端下载
  • 支持读写挂载:本地创建/写入/删除/重命名自动同步到云端
  • WriteBuffer:小文件内存缓冲,大文件 (>256MB) 落临时文件后流式上传
  • 优雅卸载与初始同步注册所有远程文件为 inode

🔐 QR 码扫码登录

  • X25519 + AES-GCM 加密中继
  • 桌面端展示二维码,移动端扫码授权
  • 站点品牌自动获取(站点名/描述/favicon)
  • 健康探测createSession 之前先调 QrLoginService.healthCheck(relayBaseUrl)(6s timeout),relay 不可达或 ok != true 直接停在 loading 之前
  • 探测失败设 _qrRelayUnavailable=true 并展示部署方案超链接,桌面端 / 移动端等价实现
  • 移动端错误占位区文案外加 horizontal: 24 padding 避免窄屏边缘贴边

来自: @mkw2233 推荐走她的一键式打包器, 独立部署请见

🖥️ 桌面端深度增强

  • 登录页:≥760px 自动切换双面板布局
  • 概览页:入场动画 + 存储卡过冲回弹进度动画 + 四区段最近活动表格
  • 文件管理器:桌面首页概览面板 + 分类 Tab + 操作栏 + 下载目标选择
  • 与我共享:独立浏览页 TransferredFilesPage
  • 悬浮窗:桌面悬浮上传窗口 (FloatingUploadService + Bridge)
  • 系统设置:上传后关机、开机自启动
  • 剪贴板分享链接自动检测ShareClipboardWatcher
  • 桌面端 WebView 验证码:使用 flutter_inappwebview,Windows 支持长按按钮 WebView2 代理设置(WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS 环境变量)
  • 桌面端拖拽上传:Windows/Linux 支持 desktop_drop

@mkw2233 多项优化和功能增强

🏷️ 品牌定制构建

  • 新增 BrandConfig,支持锁定服务器地址的定制版构建
  • 编译开关:MKW_BRANDED_BUILD / MKW_LOCK_SERVER / MKW_FIXED_SERVER_*
  • mkw_packager 代码生成入口:brand / qr / server / update / mobile_splash 6 套配置一键生成

📦 应用内自动更新(PR-7)

新增 AppUpdateService + AppUpdateDialog,无需手动下载覆盖:

  • Windows:下载 ZIP 到临时目录,通过小程序实现关闭主程序后自动覆盖更新
  • Android:通过 MethodChannel 调系统安装器 + 未知来源权限引导

依赖打包器扩展, github 兜底

📱 移动端启动预加载(PR-7)

新增 MobileStartupPreloadService,移动端启动时预加载关键资源,减少首屏白屏时间。

⚠️ 错误友好化(PR-7)

新增 UserFriendlyError,统一错误转换(替代裸 toString()),支持 login / upload / folder / download 场景,把后端错误码翻译成用户可读的中文提示。

📂 文件管理器增强

  • UI 大重写files_page / file_grid_item / file_list_item / selection_toolbar / file_menu_helper / file_breadcrumb 全部重写
  • 分页加载:滚动到底部自动加载下一页(全平台)
  • 排序功能:按名称/大小/修改时间/创建时间,升序/降序
    • 桌面端表头点击切换,移动端 PopupMenuButton
    • 排序偏好持久化
  • 键盘快捷键:Ctrl+F / Cmd+F 呼出搜索,Esc 关闭
  • 鼠标右滑返回:右→左快速滑动 (>150px, 500ms 内) 返回上一级
  • 文件夹打包下载:列表/网格/多选均支持,展示「服务端打包中」异步状态
  • 新增 DownloadStatus.archiving:紫色 archive 图标 + 不确定进度条 + 可取消
  • 桌面端面包屑修复:中文路径正确 URL decode

📄 PDF 预览菜单

文件管理器 / 分类页 / 转存浏览页 / 历史版本 四处 PDF 入口统一弹出 PdfActionMenu 三选项:

  • 原生预览:push pdfPreview 路由,PdfViewer.uri + PdfViewerSizeDelegateProviderLegacy,保留文本选择 + 高亮 + entityId 历史版本支持
  • Open ExternallylaunchUrl(externalApplication)
  • Copy URLClipboard.setData
  • 抽出可复用 widget PdfActionMenu.show(context, file, {entityId}),封装 _resolveUrl / _openExternally / _copyUrl

📝 文本编辑器(新增)

新增基于 re_editor: ^0.9.0 + re_highlight: ^0.0.3 的 VS Code 风格文本编辑器 DocumentEditorPagelib/presentation/pages/preview/document_editor_page.dart,~1500 行)。

入口

  • 文件管理器点击 文本 / Markdown 文件改为弹出 TextActionMenu(仿 PdfActionMenu),二选一:预览 / 编辑器
  • 新建文件成功后弹「打开编辑器?」对话框,确认则跳转编辑器并预填空内容
  • 新建文件遇到 40004 ObjectExisted 时拉取已存在文件信息,弹「文件已存在,是否直接打开编辑器」

核心能力

  • 语法高亮:30+ 文件扩展名映射到 re_highlight 语言(Dart / JS / TS / Python / Rust / Go / Java / C / C++ / C# / Kotlin / Swift / Ruby / PHP / Bash / SQL / YAML / JSON / XML / HTML / CSS / SCSS / Less / Markdown 等)
  • 多主题:Atom One Dark / Atom One Light / Monokai Sublime + 跟随系统,主题选择持久化(StorageKeys.editorTheme
  • 视图选项:显示行号 / 自动换行 / 代码折叠 切换
  • 字号调整:Ctrl+= / Ctrl+- / Ctrl+0(重置默认 14px),数字键盘等价键位
  • 编辑:撤销 / 重做 / 剪切 / 复制 / 粘贴 / 全选
  • 查找替换:仿 VSCode 顶部面板(Ctrl+F 查找、Ctrl+Alt+F 替换、Esc 关闭)
  • 保存上传:保存走覆盖上传(UploadTaskModel.overwrite=trueentity_type: "version"),脏文件状态实时反映;保存任务 hidden=true 不污染上传任务管理页(详见下文)
  • 重新加载远端:脏文件二次确认后重新拉取
  • PageUp / PageDown 翻页re_editor 0.9.0 内部 moveCursorToPageUp/Down 是空 TODO,自实现:用 _editorKey GlobalKey 读 viewport 高度推算 pageLines,clamp 到 codeLines 范围后 CodeLineSelection.collapsed + makeCursorVisible

全局快捷键

  • F9:显示全部快捷键弹窗(_shortcutsDialogOpen 防止重复按 F9 弹出多个对话框)
  • F11:切换全屏(应用级注册,进程整个生命周期都生效,详见下条)
  • F12:隐藏 / 显示 AppBar(避开 Windows F10 触发系统菜单 WM_SYSCOMMAND/SC_KEYMENU 的副作用)
  • 状态栏右侧主题名单击循环切换主题(MouseRegion(SystemMouseCursors.click) + GestureDetector + Tooltip("点击切换主题")

响应式布局(断点 width >= 800):

  • 宽屏:AppBar 显示 File / Edit / View 三个独立菜单按钮(图标+文字)+ 独立保存按钮;状态栏完整(状态 / 行列号 / 行数·字符数 / 语言 / 主题 / 字号)
  • 窄屏:AppBar 收成单个汉堡 Icons.menu 聚合三组菜单(PopupMenuDivider 分隔)+ 保存按钮;状态栏精简(状态 / 行:列 / 主题 / 字号),修复窄屏端 RenderFlex overflowed by 2.9 pixels
  • 公共部分抽出:_fileMenuItems / _editMenuItems / _viewMenuItems 三个 PopupMenuEntry 列表 + _handleMenuAction(value) 统一 switch 分发

🎹 全局快捷键服务(新增)

新增 GlobalShortcutsService (lib/services/global_shortcuts_service.dart),进程级注册一次后整个应用生命周期内响应。

  • HardwareKeyboard.instance.addHandler 拦截 F11 keydown
  • Future.microtask(_toggleFullScreen) 让事件链先派发完,再切换全屏,避免在 keyboard handler 内同步触发原生窗口操作导致状态错乱
  • 不缓存全屏状态,每次直接读 windowManager.isFullScreen(),与系统 / 用户其他途径切换全屏保持同步
  • _toggling 重入守卫
  • 仅 Windows / Linux 启用,在 main.dartDesktopService.initialize() 之后注册

🙈 隐藏上传任务(编辑器保存不污染上传任务管理页, 不走content接口)

UploadTaskModel 新增两个字段:

  • hidden:编辑器保存调用上传服务时设为 true,避免同一文件保存 N 次堆出 N 条任务、且重启后仍存在
    • UploadService.allTasks / activeTasks 过滤 hidden
    • _saveTasks 不持久化 hidden(_tasks.values.where((t) => !t.hidden)
    • _syncForegroundNotification 不计入 hidden(前台通知)
    • 终态(completed / failed / cancelled)后 _purgeHiddenTaskIfTerminal 主动从 _tasks 移除并清理 _cancelTokens / _progressControllers / _speedTrackers
  • overwrite:对应 Cloudreve entity_type: "version",已有同名文件当作新版本写入而不是直接报 ObjectExisted(编辑器保存默认开启)
  • UploadManagerProvider.startUpload 新增 overwrite / hidden 命名参数 + 返回 List<String> task id 列表(调用方可监听任务状态)

🎨 同步页面 UI

  • 桌面端同步页:左右双卡片(渐变状态卡 + 饼图统计卡)
  • 移动端同步详情页 SyncPageAndroid:顶部渐变卡片 + 同步摘要 + 任务卡片列表
  • SyncStatsCard:饼图(上传/下载/重命名/移动/冲突/失败明细),添加「同步数据概览」标题
  • MirrorWcf 操作统计修复:水合/占位符/删除/重命名/移动均记录 task_item

🎬 Tab 切换动画

  • AppShell tab 切换 320ms 淡入 + 4% 方向性滑入(前进右滑、后退左滑)
  • 保留 IndexedStack + AutomaticKeepAliveClient 状态保持

📋 分享功能重写

  • 重写分享页 (shares_page +694) + 功能增强 + 强化错误提示
  • 合并 PR-5 分享链接 / 公告弹窗 / 剪贴板检测 / 分类页多选增强 / V4 分享面板
  • 应用设置 → 分享链接:新增「清空分享链接弹窗记录」入口(带二次确认)
    • ShareClipboardWatcher.ignoredKey / lastOpenedKey 提升为 widget 级 public 常量
    • 新增 ShareClipboardWatcher.clearFingerprintCache() 静态方法,清理后下次复制原本被忽略 / 打开过的分享链接,剪贴板监听会重新弹提示

📥 下载增强

  • 进行中和等待中的下载任务增加取消按钮
  • 删除下载任务可选「同时删除本地文件」
  • Android 公共目录路径改用 external_path 动态获取(不再硬编码 /storage/emulated/0/

📤 上传/下载任务管理(文件夹上传重构优化持久化方式)

任务持久化迁移到 drift + SQLite

  • 新增 task_database.dart(drift 表定义 + DAO),替代 SharedPreferences 全量序列化方案
  • 启动只加载未完成任务(通常 < 100 条),NativeDatabase.createInBackground 把 IO 移到后台 isolate,彻底解决大量历史任务启动卡几十秒的问题
  • 进度更新 500ms 节流写库,状态变更即时落库;崩溃恢复时任务状态正确恢复
  • 旧版 SharedPreferences 任务启动时自动迁移到 drift,迁移后清除旧 key

分页加载

  • upload_tasks_tab / download_tasks_tabStatefulWidget + StreamBuilder + drift watch()
  • 进行中任务用 Consumer(内存),失败 / 已完成任务用 Stream + 分页(首页 20 条,滚动到底部自动加载)
  • 数据库变更时 Stream 自动推送,无需手动刷新

文件夹上传

  • 桌面端 / 移动端支持选择整个文件夹上传,保留本地目录结构
  • 远程文件夹批量并发创建(最大并发 5),文件大小并发批量读取(50 一批)
  • 移除 FileSystemEntity.type 多余调用,直接用 entity is File/Directory 运行时类型判断

上传并发控制

  • UploadService_UploadSemaphore(10),最大 10 个任务同时上传
  • startUploadDirectory 循环改 unawaited,避免串行 await 阻塞

上传断点续传(详见 Bug 修复):

  • 暂停后恢复从断点继续,不再从头重传
  • OneDrive / 本地 / 中转 / 从机策略支持断点续传,S3-like 策略保持原行为

UI 卡顿治理

  • addTask 1000 次 notifyListeners -> addTasks 批量化(1 次 notify + 1 次 DB batch 写入)
  • _updateRuntimeTask notifyListeners 50ms debounce
  • UploadService 维护 _activeCount 计数器 O(1),替代 activeTasks.length O(n) 遍历
  • 导航栏 / tasks_page 角标改用 activeCount
  • FloatingUploadBridge 改用 allTasksIterable,避免每次创建 1000 元素 List 的 GC 压力
  • upload_progress_item / download_progress_item 移除 BackdropFilter + ClipRRect(移动端离屏渲染导致首次 paint 慢)

🌐 网络与认证

  • client_id 全层共享:Dart 生成持久化、ApiService 自动附加 X-Cr-Client-Id、Rust 统一使用
  • 404 silent 标记:错误拦截器支持 silent404listGroups 404 时放行并 Toast 提示「Pro 专属功能」
  • 凭证过期 (40020):Toast 提示并跳转登录页(不清除账号密码)
  • Token 刷新并发去重:改用 Notify 通知机制
  • 强制直连:新增 DirectHttpClientFactory + 全局 HttpOverrides DIRECT,强制不走系统代理

🐛 Bug 修复 (Fixes)

同步引擎

  • 修复 SSE 事件流完全无法工作的 6 个 bug(跨 chunk 行缓冲 / token 刷新 / URI 硬编码 / 多行 data / move 事件 / 零日志)
  • 修复 SSE 事件回环(Rust API 请求附加 X-Cr-Client-Id
  • 修复 rename 事件处理(远程 rename→本地重命名,本地 rename→调用 API 远程重命名)
  • 修复 rename + scanDirs 重复 Worker
  • 修复 SSE 路径计算丢失目录层级、远程操作自触发抑制
  • 修复同步引擎死锁 + 无日志 + 无进度(OnceCell 替代 Mutex / tracing 初始化 / 后台 spawn / 状态轮询)
  • 修复同步引擎 tokio 运行时阻塞调用 panic(spawn_blocking 包装 DB 初始化)
  • 修复 SyncProvider 未注册导致导航崩溃
  • 修复覆盖上传(entity_type=version)+ URL 解码文件名 + 跳过元数据文件 + hash 对比避免无变化上传
  • 修复 API 文件列表字段名 (objects→files)、uri 从 path 推导、upsert_sync_root 避免外键破坏
  • 修复 Windows 重命名重试增强(10 次,1s~10s 递增)
  • 修复文件夹递归创建 + 路径反斜杠规范化
  • 修复 KeepBoth 策略:重命名本地后下载远程版本到原位置
  • 修复删除文件夹时递归清理数据库映射(LIKE dir/% 清理所有子文件)
  • 修复根目录空条目(walkdir strip_prefix 后 relative_path 为空,跳过)
  • 修复冲突判断逻辑:远程 API 不返回 hash,改为「有 hash 比 hash,无 hash 比 size」
  • 修复删除文件遇 40073 锁冲突时自动解锁重试
  • 修复 MirrorWcf 操作统计始终为 0
  • 修复同步配置热更新和传输并发/带宽限制
  • 忽略 Android 回收站 .trashed- 文件,避免远程重命名错误
  • 改进 sync-core 网络错误信息(区分连接失败/超时/解码失败,附带 URL 和底层错误链)
  • FsScanner 跳过以 . 开头的隐藏目录/文件(.tmfs, .mediaTrash 等)

FUSE

  • 修复挂载路径(直接挂载到 local_root,移除 .cloudreve_fuse 子目录)
  • 修复优雅卸载(dispose_sync_engine / sync_shutdown 调用 cleanup_fuse)
  • 修复初始同步文件水合(注册所有远程文件为 FUSE inode)
  • 修复 register_sync_event_sink 在非 Tokio 线程 panic

文件管理器

  • 右键菜单失效_loadFolders 三处 setState 都未检查 mounted,对话框先关闭、异步 listFiles 后返回时 State 已 dispose 触发崩溃;同时移除 MouseRegion + onExit 包裹(鼠标越过边界提前关闭菜单),右键菜单除选择按钮外全部失效问题修复
  • 菜单贴底被截断:新增 flipUp 逻辑,下方空间不足时以底边界为基点向上展开;底边界优先取面包屑顶端(fileMenuBottomBoundaryKey GlobalKey + RenderBox),其次取视口底;极端窄屏下 ConstrainedBox(maxHeight) + SingleChildScrollView 兜底滚动
  • Ctrl+F 搜索跳转后被滚回:新增 _isAutoScrollingToHighlight 标志屏蔽 _onScrollForSummaryCollapse,列表 / 网格分支抽出 _scheduleHighlightJump:先同步折叠 summary,等 AnimatedSize 收缩完成 (660ms) 再 jumpTo,依赖 FileListItem.isHighlighted 边框闪烁动画提供视觉反馈
    • 根因:summary 改为始终挂载后,进入子目录默认展开,animateTo 滚动越过 96px 触发 listener 折叠 → AnimatedSize 620ms 收缩 → ListView viewport 增大、maxScrollExtent 减小 → 滚动位置被 clamp 回更小的值,呈现"滑回"

分享

  • 概览页「最近分享的文件 → 查看更多」:从误跳 TasksPage 改为正确跳转 RouteNames.shareSharesPage);其他卡片路由保持不变
  • 转存识别 Pro 专属:捕获到 ServerExceptioncode == 40081 并且 message 包含 Not supported action 时,弹出 Pro 版本提示;其他错误仍走原 转存失败:$e
  • 编辑分享 Dialog 文件名被遮:第一个「文件名」TextField 的 floating label 上半部分被裁掉 — shares_page.dart:735 内层 SingleChildScrollViewEdgeInsets.only(top: 6)

上传

  • 任务页「清除已完成/失败」按钮在重启后失效:drift 持久化迁移后 _tasks 内存里只有 active 任务,completed/failed/cancelled 任务只在 db 里。clearCompletedTasks / clearFailedTasks 仍遍历内存找目标任务,重启后内存为空导致 db 行删不掉。改为先调 deleteUploadTasksByStatus / deleteDownloadTasksByStatus 批量 SQL 删除,drift watch() 自动推送 db 变更到 StreamBuilder,UI 立即刷新。
  • 暂停上传后恢复从头重传retryUpload 暂停恢复走这个方法,但只有 OneDrive 保留 uploadedBytes/uploadedChunks,非 OneDrive 全部重置为 0 且 session 被删除;startUpload 复用 session 的条件只允许 OneDrive;_uploadMultipartresumeStart = 0 只对 OneDrive 查询 nextExpectedRanges。三处联动导致非 OneDrive 永远从 index 0 开始。修复:retryUpload 区分暂停恢复和失败重试,暂停恢复 + 可续传策略(OneDrive/本地/中转/从机)保留 session + 进度;startUpload 扩展 session 复用条件;_uploadMultipartelse if 让本地/中转/从机策略用 task.uploadedBytes 作为 resumeStart。S3-like 策略的 complete 需要所有 parts 的 ETag,跳过分片会导致 complete 失败,保持原行为。

跨平台

  • 修复 Linux 无 XDG_DOWNLOAD_DIR 环境变量导致获取默认本地同步目录异常
  • Windows/Linux WebView 兼容性(webview_flutter → InAppWebView)
  • 桌面端概览页文件管理器面包屑中文路径未 URL decode
  • Windows WebView2 验证状态刷新 + Turnstile 进度提示
  • Windows MSBuild 找不到 nuget.exe 的问题(NuGet 搜索路径辅助)
  • 桌面端验证码长按代理找回:UI 重写期间被误删,已恢复
    • captcha_service.dart 新增 _isDesktop getter + _proxyConfig 字段
    • OutlinedButton.icon 加回 onLongPress(仅 Windows 才不为 null)
    • 长按弹出 _showProxyDialog:地址 / 端口 / 清除 / 取消 / 确定
    • openCaptchaChallenge 透传 proxyConfigCaptchaChallengePage
    • captcha_challenge_page.dart 补回 CaptchaProxyConfig 类、_applyWebView2Proxy / _clearWebView2Proxy_proxyEnvSet 标志,dispose 时按需清理 WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS 环境变量

其他

  • 修复桌面端下载默认路径不生效
  • 修复账号切换后 Provider 状态未重置
  • 修复概览页切换时存储容量不刷新
  • 修复权限编辑 BottomSheet 小屏溢出
  • 修复应用日志级别 UI overflow
  • 添加 Android largeHeap="true" 修复大分片上传 OOM(100MB 应用闪退, 服务端不要设置太大分片)
  • 上传进度显示可读文件大小替代原始字节数
  • 升级 pdfrx: ^2.2.24 → ^2.4.1
  • ShareDio LogInterceptor 日志降级为 trace
  • 宽屏端用户 / 用户组对话框铺满全屏_StyledDialog_StyledConfirmDialog 内层包 ConstrainedBox(创建:maxWidth: 420,删除:maxWidth: 380

♻️ 重构 (Refactor)

  • 文件管理器 UI 大重写files_page / file_grid_item / file_list_item / selection_toolbar / file_menu_helper / file_breadcrumb
  • 分享页重写 (shares_page +694)
  • 应用骨架重写 (app_shell +335) + 路由调整
  • 回收站 / 概览存储卡 / 登录桌面端增强
  • 登录页 / 文件管理 / 对话框 / 设置页共享组件提取:消除大量重复代码
  • sync-core 大文件拆分:拆分为目录模块,优化代码组织
  • 跨平台编译:增加 #![cfg(target_os = xxx)],各自平台只编译自己的部分
  • 同步事件处理完整重构:notify-debouncer-full 自动配对 rename,本地 rename/move/delete 走 API
  • 同步页面布局调整:状态文字占顶部整行、左圆右统计、下方饼图、最底部任务列表
  • 同步模式重构:全量 / 仅上传 / 仅下载 + 同步 Tab 页 + 远程目录 FolderPicker + maxWorkers 配置
  • 任务持久化从 SharedPreferences 迁移到 drift/SQLite:详见「上传/下载任务管理」
  • 桌面端标题栏站点品牌缓存从 SharedPreferences 迁移到文件系统:二进制数据(站点 logo / favicon)不再走 SharedPreferences,避免 base64 序列化膨胀
  • 移动端登录页移除私有图床 logo:删除写死的 https://xxxx.com/*.webp,改用本地 asset app_logo.png,logo 三级回落变为:站点 logo bytes -> 当前站 favicon -> 本地 app_logo.png,不再依赖任何外部私有资源

📦 依赖升级 / 新增

依赖 版本 用途
flutter_inappwebview ^6.2.0-beta.3 桌面端验证码等需要用到 WebView (Windows/Linux统一)
external_path ^2.2.0 Android 公共目录动态获取
pdfrx ^2.4.1 (升级自 2.2.24) PDF 预览
re_editor ^0.9.0 文本编辑器核心
re_highlight ^0.0.3 编辑器语法高亮(30+ 语言)
drift ^2.21.0 任务持久化 ORM(类型安全 SQL)
drift_flutter ^0.2.4 drift 桌面端集成(含 sqlite3_flutter_libs + path_provider)
sqlite3_flutter_libs ^0.5.28 全平台原生 SQLite 二进制(Win/Linux/macOS/Android/iOS)
enough_convert ^0.0.1 纯 Dart GBK/GB18030 文本解码

dev_dependencies:

依赖 版本 用途
drift_dev ^2.21.0 drift 代码生成

Rust 侧依赖 (workspace native/):

  • flutter_rust_bridge - Dart↔Rust 桥接
  • tokio / tracing / notify-debouncer-full / reqwest / rusqlite / walkdir
  • windows (CFApi, feature windows-cfapi)
  • fuser (Linux FUSE, feature linux-fuse)
  • jni / android_logger (Android, feature android-media)

⚠️ 重大变更 (Breaking Changes)

  • SyncMode 枚举重构:删除 Selective,新增 UploadOnly / DownloadOnly / MirrorWcf / AlbumUpload / AlbumDownload
  • 数据库迁移:sync-core 数据库和日志移至应用数据目录
  • SyncConfig:删除 selective_dirs,新增 max_workers

🙏 致谢

感谢 @mkw3627-ui 对本项目的重要贡献—大量桌面端 UI 增强、QR 登录、悬浮窗、分享链接检测、Desktop 文件管理器ui布局增强, 同步向导等均源自其 PR

完整 commit 历史git log v1.3.0_3_pr2..v1.4.0