# 有条 **Repository Path**: jason1012/youtiao ## Basic Information - **Project Name**: 有条 - **Description**: 一款基于 Flutter 的轻量级待办 / 任务管理应用,支持分类、优先级、回收站、数据备份导出、深浅色主题、周趋势统计与定时提醒。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-08-01 - **Last Updated**: 2026-10-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 有条 一款基于 Flutter 的轻量级待办 / 任务管理应用,支持分类、优先级、回收站、数据备份导出、深浅色主题、周趋势统计、定时提醒与专注环境音。 应用名「有条」,包名 `com.example.todolist`(发布标识,发布后不可更改)。 开源协议 **[MIT](LICENSE)** > ⬇️ **最新安装包请到专用仓库下载**:本仓库已停止上传 APK(Gitee 附件配额按仓 1 GB)。发布仓依次承接:≤v2.4.0 在 **[youtiao-releases](https://gitee.com/jason1012/youtiao-releases/releases)**,v2.4.1~v2.7.7 在 **[youtiao-releases-2](https://gitee.com/jason1012/youtiao-releases-2/releases)**,v2.7.8~v3.0.0 在 **[youtiao-releases-3](https://gitee.com/jason1012/youtiao-releases-3/releases)**(已满,只读保留),**v3.0.1 起在 [youtiao-releases-4](https://gitee.com/jason1012/youtiao-releases-4/releases)**。点此直达**全部发行版列表(最新)** 👉 ## ✨ 功能特性 - 📝 **任务管理**:新增、编辑、删除,支持分类与优先级 - 👉 **手势操作**:向左滑编辑、向右滑删除 - 🗑️ **回收站**:误删任务可在回收站恢复或彻底删除 - 💾 **数据安全**:本地备份 / 恢复,导出 CSV 与 Markdown - 🌗 **主题**:浅色 / 深色,支持跟随系统自动切换 - 📊 **看板(统计 + 分列)**:完成率、优先级分布、分类进度、周趋势(含上周对比);两列看板(待办/已完成)可拖拽或点击切换状态 - 🖼️ **看板一键分享**:把看板数据生成一张约 1080px 宽的竖版长图,面板内实时预览、按需勾选板块(完成率/统计/优先级/分类/趋势/看板明细),支持浅深色卡片与「隐藏任务标题」,可保存到相册(`Pictures/有条`,免存储权限)或直接分享 - 🏠 **首页一键分享**:与看板分享同源,把首页「日期分区」清单(逾期/今天/未来/每天/已完成)生成同样的竖版长图——每个分区下直接列出任务标题、分类与相对截止时间,行首色条跟随优先级;复用相同面板与导出能力,不混入看板分析板块 - 🔔 **定时提醒**:支持任务的定时通知 - 🔁 **每日提醒**:为任务设定「每天固定时间提醒」(如每天 7:00 背单词),每天准时推送,独立于一次性截止提醒 - ✅ **多选批量删除**:长按任务进入多选模式,可一次勾选多个任务批量删除(支持撤销) - 🛡️ **后台提醒守护**:前台服务常驻,保证在国产 ROM(ColorOS / MIUI 等)上划掉后台后定时提醒仍能准点触发;看板页提供守护状态卡 - 🔎 **首页筛选**:筛选芯片(全部/待办/已完成/逾期)与看板统计卡联动,点击统计卡直达对应筛选 - 🗓️ **首页按日期分区**:「逾期 / 今天 / 未来 / 每天」四段 + 「已完成」,按截止日期真正落段(无截止归入「今天」,每日提醒任务独占「每天」),互不重叠;空分区自动隐藏,各分区标题字号统一 - 📅 **日历(月 / 周视图 + 拖拽改期)**:日历 Tab 支持「月视图 / 周视图」分段切换;月视图按每天完成数做热力着色,当天到期任务以条状呈现;任务条支持长按拖拽到任意日期格**松手即改期**(自动重排提醒),已完成任务灰显不可拖;点日期查看当天完成明细 - 🕛 **每日任务 00:00 自动重置**:无需打开 App,每天午夜由系统闹钟后台将已完成的每日任务重置为未完成,真正实现「每天循环打卡」 - 🎨 **设计**:Material 3 设计语言 - ⏱️ **专注计时(番茄钟)**:新增「专注」Tab,内置番茄钟倒计时(25 / 5 / 15 分钟预设,可开始 / 暂停 / 停止),可关联某一任务,自动记录每次专注时长与今日专注统计,数据本地持久化 - 🌊 **专注环境音(淡入淡出 + 多音叠加)**:内置白 / 粉 / 棕噪音与雨声 / 海浪 / 篝火 / 风声七种零版权环境音(程序化合成),支持多选同时叠加播放、切换时 500ms 音量渐变避免爆音,选择自动记忆 - 🔥 **习惯打卡增强**:单习惯详情含专属热力图与当前/最长/累计连续天数统计;破纪录全屏庆祝动效;支持单习惯战绩分享长图(浅/深主题) ## 🛠 技术栈 - Flutter 3.x / Dart - Material 3 - Provider(状态管理) - flutter_local_notifications(定时通知) - package_info_plus(版本读取) - shared_preferences(开关/偏好持久化) - sqflite(任务、回收站与专注记录持久化) ## 📦 环境要求 - Flutter SDK 3.x - Android SDK(minSdk 24,targetSdk 36,compileSdk 36) - iOS 需 macOS + Xcode ## 🚀 构建与运行 ```bash flutter pub get flutter run # 调试运行 flutter build apk --release # 构建 Android release 包 ``` ### 🔐 Release 签名(必读) 自 v2.6.0 起,release 构建**强制使用固定 keystore 签名**,不再使用 debug 密钥: - `android/app/build.gradle.kts` 在 `buildTypes.release` 里检查四个环境变量: `YOUTIAO_KEYSTORE` / `YOUTIAO_KEY_ALIAS` / `YOUTIAO_KEYSTORE_PASSWORD` / `YOUTIAO_KEY_PASSWORD`; - **缺任一变量时构建直接失败**,绝不静默回退到公开 debug keystore (v2.5.9 曾误发 debug 签名包,debug 密钥是公开的,任何人都能用它伪造「同名安装包」诱导覆盖安装); - keystore 与口令**不入库**(`.gitignore` 已忽略),仅保存在本机与构建脚本使用的环境变量中。 构建 release 前先导出变量(PowerShell 示例): ```powershell $env:YOUTIAO_KEYSTORE = "E:\path\to\youtiao-release.jks" $env:YOUTIAO_KEY_ALIAS = "youtiao" $env:YOUTIAO_KEYSTORE_PASSWORD = "" $env:YOUTIAO_KEY_PASSWORD = "" flutter build apk --release --target-platform android-arm64 ``` 用户侧校验:安装后若签名不一致,Android 会直接拒绝覆盖安装并提示「未安装」。 #### 用户如何核验安装包真伪 侧载场景下,建议在下完 APK 后核一次哈希再安装: ```powershell # PowerShell:比对 sha256 与发布说明中给出的值 Get-FileHash .\app-release-x.y.z-arm64.apk -Algorithm SHA256 ``` App 内的更新流程已内置同一道校验(下载后比对 `update.json` 的 `apkSha256`, 不一致即拒绝安装);手动下载时请自行比对发布说明里的哈希值。 > 关于信任链:目前能防到「传输被篡改 / 下载不完整」,**尚不能防「作者 Gitee 账号 > 被盗后伪造清单」**——那种情况下 `apkUrl` 与 `apkSha256` 会被同时改掉。 > 根治方案是给 `update.json` 做离线 Ed25519 签名、App 内置公钥验签(已在路线图中, > 属远期项)。在此之前,请以发布页说明与哈希为准。 ### 关于 Gradle(本机 Windows 提示) 本工程在 Windows 上构建时,建议把 `GRADLE_USER_HOME` 设在与工程**同盘**的路径(如 `D:/workbuddy/.gradle`),可规避 Gradle 9.1 跨盘符号链接快照失败(`not a regular file`)。另外 `android/app/build.gradle.kts` 已对 `merge*NativeLibs` / `extract*NativeSymbolTables` 任务关闭状态追踪作为兜底。 ## 🔔 后台提醒守护(重要) 为了让定时提醒在「划掉后台」后依然准时触发,应用内置了一个**前台守护服务**: - 服务运行在独立进程 `:guard`,App 主进程被划掉后守护进程仍存活; - 闹钟的接收器(`ScheduledNotificationReceiver`)也声明在 `:guard` 进程,闹钟到点直接在守护进程内投递通知,无需重启主进程; - 设置页提供「后台提醒守护」总开关(默认开),关闭即停止该服务。 **注意事项(国产 ROM 用户必读):** 1. 状态栏会常驻一条「有条 · 提醒守护中」通知,这是前台服务的硬性要求,点开即回到 App,无需理会。 2. **不要用手机管家的「一键加速 / 强力清理」去清「有条」** —— 那是强杀,前台服务也挡不住;正常使用「最近任务上滑划掉」不受影响。 3. 建议一并开启:设置 → 应用 → 有条 → **自启动**、**电池无限制 / 允许后台运行**、**精确闹钟(闹钟和提醒)**,并把 App 加入手机管家清理白名单、在最近任务卡片下拉锁定。 4. 开机重启后守护服务会自动重新排程已有的定时提醒。 > 为什么需要这套机制?普通本地 App 在 ColorOS / MIUI 上被划掉后台后,系统会冻结其后台闹钟,导致定时通知不响。微信 / QQ 能扛住是因为接入了厂商系统推送(ROM 默认白名单),而本地 App 没有服务器,只能用「前台服务 + 独立进程 + 同进程接收器」这套方案保活。 ## 📦 发行版(Release) 安装包不纳入 git(二进制大文件,被 `.gitignore` 忽略)。**本仓库已停止上传 APK**,发布仓按 Gitee 附件配额(1 GB/仓)依次承接: - ≤ v2.4.0:**[youtiao-releases](https://gitee.com/jason1012/youtiao-releases/releases)**(配额已满) - v2.4.1 ~ v2.7.7:**[youtiao-releases-2](https://gitee.com/jason1012/youtiao-releases-2/releases)**(配额已满) - v2.7.8 ~ v3.0.0:**[youtiao-releases-3](https://gitee.com/jason1012/youtiao-releases-3/releases)**(配额已满,只读保留) - **v3.0.1 起:[youtiao-releases-4](https://gitee.com/jason1012/youtiao-releases-4/releases)**(当前) - 📥 全部发行版列表(最新):(U2-2,v3.0.5 审计:改用**不带硬编码版本号**的稳定链接,发版无需同步改 README) ## 📁 项目结构 ``` lib/ main.dart # 应用入口 models/ # 数据模型(Task 等) state/ # 状态管理(Provider) services/ # 通知 / 前台守护服务封装 screens/ # 页面(首页 / 设置 / 回收站 / 帮助) widgets/ # 可复用组件 assets/ # 图标等静态资源 android/ ios/ # 原生平台工程 ``` ## 📄 开源协议 本项目基于 [MIT License](LICENSE) 开源。 简单来说:可以自由使用、复制、修改、合并、发布、分发、再授权及销售本软件,唯一要求是**在所有副本或主要部分中保留版权声明与许可声明**。软件按「原样」提供,不附带任何担保,作者不对使用本软件产生的任何索赔或损失负责。 完整条款见仓库根目录的 [`LICENSE`](LICENSE) 文件。