Releases: LimoYuan/cloudreve4_flutter
Release list
Release 1.4.0+2
Release 1.4.0+1
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:按需水合 + 读写挂载
- 全量同步 (Full):双向同步,支持 6 种冲突策略 (
- 核心特性
- 三路差异算法(本地 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: 24padding 避免窄屏边缘贴边
来自:
@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 Externally:
launchUrl(externalApplication) - Copy URL:
Clipboard.setData - 抽出可复用 widget
PdfActionMenu.show(context, file, {entityId}),封装_resolveUrl/_openExternally/_copyUrl
📝 文本编辑器(新增)
新增基于 re_editor: ^0.9.0 + re_highlight: ^0.0.3 的 VS Code 风格文本编辑器 DocumentEditorPage(lib/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=true→entity_type: "version"),脏文件状态实时反映;保存任务hidden=true不污染上传任务管理页(详见下文) - 重新加载远端:脏文件二次确认后重新拉取
- PageUp / PageDown 翻页:
re_editor 0.9.0内部moveCursorToPageUp/Down是空 TODO,自实现:用_editorKeyGlobalKey 读 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 keydownFuture.microtask(_toggleFullScreen)让事件链先派发完,再切换全屏,避免在 keyboard handler 内同步触发原生窗口操作导致状态错乱- 不缓存全屏状态,每次直接读
windowManager.isFullScreen(),与系统 / 用户其他途径切换全屏保持同步 _toggling重入守卫- 仅 Windows / Linux 启用,在
main.dart中DesktopService.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:对应 Cloudreveentity_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_tab改StatefulWidget+StreamBuilder+ driftwatch()- 进行中任务用
Consumer(内存),失败 / 已完成任务用 Stream + 分页(首页 20 条,滚动到底部自动加载) - 数据库变更时 Stream 自动推送,无需手动刷新
文件夹上传:
- 桌面端 / 移动端支持选择整个文件夹上传,保留本地目录结构
- 远程文件夹批量并发创建(最大并发 5),文件大小并发批量读取(50 一批)
- 移除
FileSystemEntity.type多余调用,直接用entity is File/Directory运行时类型判断
上传并发控制:
UploadService加_UploadSemaphore(10),最大 10 个任务同时上传startUploadDirectory循环改unawaited,避免串行 await 阻塞
上传断点续传(详见 Bug 修复):
- 暂停后恢复从断点继续,不再从头重传
- OneDrive / 本地 / 中转 / 从机策略支持断点续传,S3-like 策略保持原行为
UI 卡顿治理:
addTask1000 次notifyListeners->addTasks批量化(1 次 notify + 1 次 DB batch 写入)_updateRuntimeTasknotifyListeners50ms debounceUploadService维护_activeCount计数器 O(1),替代activeTasks.lengthO(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 标记:错误拦截器支持
silent404,listGroups404 时放行并 Toast 提示「Pro 专属功能」 - 凭证过期 (40020):Toast 提示并跳转登录页(不清除账号密码)
- Token 刷新并发去重:改用 Notify 通知机制
- 强制直连:新增
DirectHttpClientFactory+ 全局HttpOverrides DIRECT,强制不走系统代理
🐛 Bug 修复 (F...
Release v1.3.0_3_pr2
feat: 合并 PR #2 - by@mkw3627-ui
patch:
- Improve Android upload stability and background progress
- Improve download progress and resume handling
- Add same-site account switcher
- Add store tab and storage products display
- Improve captcha compatibility
- Add thumbnail and text preview improvements
- Polish UI performance for lower-end Android devices
Co-authored-by: @mkw3627-ui mail: mkw3627@gmail.com"
comment:
- 保留上述核心功能改动
- 移除了构建相关改动和项目图标
Code changes added defects -> 快捷入口新增失效- 修复所有警告和过时语法
- Android arm64 v8a test passed.
fixed:
- 文件管理器页面AppBar面包屑路径中文路径未urldecode,修复最多5重编码decode
- 维持 pr #2 的默认4个快捷入口, 保留主分支的原始新增/排序快捷入口, 抽离 QuickAccessProvider 共享状态
feat: (优化 pr #2)验证码预检机制 + 抽离 CaptchaService,登录/注册/忘记密码按需加载验证码
新增文件:
- login_config_model.dart — LoginConfigModel,解析 GET /site/config/login 响应
- captcha_service.dart — CaptchaService 单例,抽离了约 200 行验证码逻辑(加载、刷新、Web 验证码跳转、UI 构建、参数获取)
修改文件:
- auth_service.dart — 新增 getLoginConfig() 方法
- login_page.dart — 移除内嵌验证码逻辑,改为先调用 getLoginConfig() 预检,仅 loginCaptcha == true 时加载验证码;通过 loginConfig 参数传递给注册/忘记密码页
- register_page.dart — 添加 loginConfig 参数,regCaptcha == true 时显示验证码并传参
- forgot_password_page.dart — 添加 loginConfig 参数,forgetCaptcha == true 时显示验证码并传参
Release 1.3.0+2
fixed: windows cmake 构建异常
- 当 CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT 异常变为 False 时, cmake BUILD_BUNDLE_DIR 回退到了系统默认路径(C:/Program Files)导致终端权限不足无法正常构建安装
feat: 登录支持两步验证(2FA)
- 检测账号密码登录响应203状态码弹出验证码输入对话框
Release 1.3.0
Release 1.3.0+1
Change log
- UI 架构重构
- 底部导航 3-Tab 布局:概览 / 文件管理 / 我的
- 桌面端 NavigationRail + 文件管理器并排布局,新增 AppShell
- 全局主题重构:主色调 #3B82F6,细边框 Card,系统原生字体
- 毛玻璃风格统一:对话框/抽屉/FAB 使用 GlassmorphismContainer
- 移除 BackdropFilter 消除 Android 卡帧
- 概览页(新增)
- 快捷入口动态网格(2/3列自适应,可配置)
- 存储用量卡片
- 最近活动列表(统一图标+文字风格)
- 搜索入口卡片
- 文件管理器大幅增强
- 列表/网格视图切换 + 网格缩略图
- 右下角 SpeedDial FAB(搜索/上传/新建文件夹,滚动隐藏)
- 下拉刷新 + Toast 提示差异
- 加载超时重试
- 多选移动/复制操作
- 文件详情侧边栏(Drawer)+ 更多字段 + 版本管理
- 搜索改为弹出对话框
- 增量更新:增删改/上传完成原地更新列表,消除全量刷新
- 桌面端拖拽上传(desktop_drop)
- 文件时间时区修复
- 视频播放器控制栏完全重写
- 自定义 VideoControlsOverlay 替代内置控制栏
- Bilibili 风格:单击显隐、双击暂停、长按 2 倍速、倍速菜单、音量控制
- 全平台自管全屏(windowManager / SystemChrome),避免 media_kit
路由重建 - 桌面端:鼠标悬停弹出控制栏、键盘快捷键、半透明快捷键提示
- 新增 video_fullscreen.dart,main.dart 监听全屏隐藏标题栏
- "我的" Tab(新增)
- 用户信息卡片 + 管理员 Badge + 存储进度条
- 快捷功能区(可配置入口)
- 管理员区域:用户组/用户 增删查
- AdminService + AdminProvider
- 任务页面重构
- 上传/下载分 Tab 展示,桌面端 DataTable + 移动端 Card
- 毛玻璃进度条、实时速度显示
- 任务记录保留天数可配置
- 设置页增加日志管理
- 其他服务改进
- 下载迁移到 background_downloader(全平台统一)
- AvatarCacheService:Dio + 本地缓存 + Gravatar 兜底
- ThumbnailService:文件缩略图服务
- cache_manager Windows 文件占用异常静默处理
- 分享页/回收站/WebDAV 页 UI 统一优化
v1.2.1
fixed: 修复windows平台文件上传40052异常
feat: Windows/Linux平台使用background_downloader替代flutter_downloader下载, 增加下载速度显示
feat: 增加离线下载功能
重构离线下载页面UI, 实现响应式布局与任务详情抽屉
- 响应式布局: 桌面端(>800px)使用DataTable, 移动端使用卡片列表+BottomSheet
- 主题色替换: 所有硬编码颜色改为colorScheme引用, 支持暗色模式
- 任务详情抽屉: 点击任务弹出右侧抽屉,
展示创建/更新时间、状态、处理节点、输入/输出、耗时、重试次数、分片数量、错误信息
- 搜索功能: HeaderBar搜索框支持过滤任务
- Tab计数徽章: 固定宽度徽章防止布局跳动
- 空状态下拉刷新, AnimatedSwitcher状态切换动画
- 对话框响应式尺寸适配, 移除DataTable复选框列
- Model新增: TaskNode、numPieces、retryCount、resumeTime字段;
修复时区(toLocal)和耗时单位(毫秒转秒)
feat: 增加桌面端托盘功能
- 关闭窗口 → 隐藏到系统托盘(非退出)
- 左键点击托盘图标 → 恢复窗口
- 右键点击托盘图标 → 弹出菜单(显示主窗口 / 退出)
- 菜单"退出" → 彻底关闭程序
- 所有桌面代码仅 Windows/Linux 生效,Android 无影响
fixed: 修复linux下托盘增加后无法正常显示主程序window