我们构建了一个宠物用药追踪器,因为其他所有应用都让我们失望
Source: Dev.to
去年,我和伴侣领养了一只狗 🐶,随之而来的是满满的爱……以及大量的责任。
我最初尝试使用 Google Calendar,但工作会议、生日和宠物提醒全都混在一起。
在测试了多个宠物护理应用后——有的设计过度,有的缺少通知——我们决定自行构建真正需要的工具。
ZooMinder: 它的功能
- Multiple pets – 为每只宠物添加照片和出生日期。
- Treatments & medications – 记录剂量、频率(每日、每周、自定义间隔)以及特定时间的用药。
- Vet appointments – 将诊所信息、兽医姓名、电话和地址集中存储。
- Upcoming doses – 清晰显示所有宠物的下次用药时间线。
- History – 为每只宠物提供完整的过去用药和预约时间线。
- Local notifications – 自定义的“汪汪”声音提醒,即使在应用关闭时也会触发。
- Offline‑first – 无需网络即可使用;恢复联网后数据会同步到云端。
技术栈
| 层 | 技术 |
|---|---|
| 框架 | Flutter (Dart 3.10+) |
| 本地数据库 | SQLite via sqflite |
| 后端与认证 | Supabase |
| 通知 | flutter_local_notifications + custom sound |
| 导航 | go_router |
| 国际化 (i18n) | Flutter’s intl (English + Spanish) |
| 应用内购买 | in_app_purchase |
| 同步 | Custom offline‑first sync service |
离线优先同步
应用程序首先将所有数据本地存储在 SQLite 中。每条记录都有一个 synced 标志。当设备重新获得连接时,SyncService 会将未同步的记录推送到 Supabase,并拉取远程更改,使用时间戳 (updated_at) 解决冲突。
// Every model carries its sync state
class Treatment {
final bool synced;
final DateTime updatedAt;
// …
}
这种设计使得应用可以在飞机上、农村地区或任何没有信号的地方运行——你的宠物日程永远不依赖于 Wi‑Fi。
通知
为药物和预约专门创建了 Android 通知渠道,每个渠道都使用自定义声音。服务会为每个治疗计划安排最多三个即将到来的通知,并在添加或修改治疗计划时重新计算。
static const _medicationChannel = AndroidNotificationChannel(
'medication_reminders_v2',
'Medication Reminders',
importance: Importance.high,
sound: _customSound,
playSound: true,
);
教训
- 离线优先值得但很痛苦 – 同步逻辑及冲突解决花费的时间比所有 UI 加起来还多,但用户体验的回报巨大。
- 通知是雷区 – Android 权限模型、电池优化和时区处理,使得即使是一个简单的上午 8 点每日提醒也异常复杂。
- 范围蔓延是真实存在的 – 最初的“记录药物”功能演变成预约管理、剂量历史时间线、兽医诊所存储、付费订阅以及多语言支持。学会对功能说“不”至关重要。
- 家庭项目让你保持诚实 – 当你的共同开发者也是你的伴侣和首位用户时,反馈既即时又毫不留情。 😄
接下来 🚀
- Family plans – 在家庭成员之间共享宠物信息,让每个人都能用自己的账户跟踪药物和预约。
- Assign responsibilities – 分配任务(例如,妈妈负责早晨剂量,爸爸负责晚上剂量),让每个人都清楚自己的角色。
- Vet‑oriented tools – 让兽医能够在 ZooMinder 内直接共享治疗方案和就诊摘要,促进与宠物主人之间的更好沟通。
可用性
ZooMinder 可在 Google Play 商店 获取。如果您有宠物并且难以跟踪它们的药物和兽医就诊,请尝试一下。
贡献与反馈
我们非常期待您的反馈。如果您是 Flutter 开发者,欢迎随时聊聊我们使用的离线优先模式。
发现了 bug、有什么建议,或想成为测试员?请在 dev.to 给我私信。作为感谢,我可以为您提供该应用的高级版完整访问权限。
![Dog picture placeholder]
#flutter #flutterdev #dart #mobiledev #android #sideproject #indiedev
使用 Flutter、Supabase 构建,键盘上沾满了大量狗毛。
祝您有美好的一天! 👋🐾