Archer Han
← 全部作品

懒猫打卡

记录只存在自己手机里的打卡工具,点一下就完成打卡

打卡首页、奖励、统计、设置四个页面并排
首页、奖励、统计、设置——日常用到的四个页面。

为什么做

我想坚持的事都很小:早起、跑步、读书、喝水。这些事能坚持下来,靠的通常不是意志力,而是一个顺手就能记一下的地方。

我用过好几个打卡 App,问题不在功能多少,而在两件事上。

一是打卡这个动作太重。打开、找到任务、选日期、写备注、确认——五步走完,我已经不太想坚持了。

二是记录不在我自己手里。数据存在别人的服务器上,账号一停、服务一关,几年的记录就跟着没了。

所以这个 App 只做一件事:打开就是今天要做的事,点一下就算打卡;数据存在手机本地的 SQLite 里,不注册、不登录、断网也能用。

每天怎么用

打卡

首页上半是日历。默认显示两周,点中间的小箭头展开成整月,打过卡的日子会留一个勾——今天在哪儿、这个月断在哪几天,一眼就能看出来。

下半是今天要做的任务。卡片颜色、图标、口号都是自己设的,扫一眼就能分清。点右边的方框就算打卡;如果一个任务每天要打多次(比如喝水八杯),方框上会显示 3/8 这样的进度。

打卡:今天的任务与整月记录

任务

一个任务能设的东西刚好够用:按周几重复(跑步只在周一、三、五、日)、持续 N 天或者永远、每天打卡 1 到 24 次、最多几个提醒时间,再加上图标、卡片颜色和一句自己写的口号。

任务列表按我自己拖出来的顺序排,每张卡片上显示已持续天数、最长连续天数和本月打卡天数。暂时不想做的任务可以用开关关掉,记录还在。

任务:全部任务与编辑任务

奖励

长期目标靠“给自己一个交代”更容易撑住。奖励页把任务和奖励绑在一起:坚持跑步 40 天就买双新跑鞋,坚持 100 天就换个书架。进度条会告诉你走到哪一步了。

统计

统计只回答三个问题:每个任务一共打了多少次、这一年哪几个月是断的、最近每周的节奏怎么样。

上面是三个总数(任务数、最长打卡天数、最长连续天数)和每个任务的打卡次数环形图,下面是一年的热力图。不做趋势预测,也不做目标达成率——那是给周报用的,不是给我自己用的。

统计与奖励

数据

这是我花最多心思的地方,也是最不显眼的地方:

  • 数据默认只在本机。想换手机时,可以把数据库同步到 iCloud,或者直接当附件发一封邮件给自己。
  • 提醒是本地通知,不经过任何服务器。每个任务、每个提醒时间都能单独设。

设置:数据与安全、会员、通用

几个刻意的选择

打卡必须一次点击完成。 代价是这里没有打卡时间、没有备注——需要留痕的场景它撑不住。我的判断是九成的打卡不需要备注。

不做账号,也不做社交。 没有排行榜、没有好友、没有分享。代价是没有自动的多设备同步:换设备要自己动一次手。换来的是服务停了,记录还在。

免费的边界画在“是否需要服务器”上。 自己用得顺手的功能不收费——打卡、统计、热力图、本地提醒都不限;任务数、提醒条数和奖励数在免费版里有上限(3 / 2 / 3),iCloud 同步和邮件备份算高级版。这两个功能背后确实有成本,也只有它们需要成本。

技术

Flutter 一套代码,iOS 和 Android 都能跑。数据用 sqflite 存在本地,状态管理是 GetX,图表是 fl_chart,日历是 table_calendar,提醒用 flutter_local_notifications,备份走 iCloud 文档目录和邮件附件。

源码开放在 GitHub:https://github.com/archerhan/clock_in

回头看

动手之前我以为最难的是数据同步,实际花时间最多的是本地通知的边界:权限什么时候请求、时区换了以后已经排好的提醒怎么算、系统清理后台之后还剩什么。这些都不写在功能列表里,但用户第一时间遇到的问题全在这里。

还有一个教训是做演示数据。开发到一半想给自己看效果,手动点十几个任务、几十天记录太费劲,后来写了一个在数据库为空时自动灌数据的模块——顺便也成了这个 App 的截图来源。

Flutter · 本地 SQLite · iCloud 备份 · 本地通知 · 开源