我用 Flutter 打造了一个隐私优先的笔记应用——我的收获
Source: Dev.to
🔗 链接
- Google Play Store –
- GitHub(开源) –
为什么要再做一个笔记应用?
我知道你在想什么——世界已经不需要再多一个笔记应用了。但事实是:大多数笔记应用要么为了功能牺牲隐私,要么为了隐私牺牲功能。我想要两者兼顾。
目标很简单
- 真正可用的端到端加密
- 美观、现代的用户界面(不仅仅是功能性)
- 多种笔记类型,不局限于纯文本
- 在不妥协隐私的前提下实现云同步
- 可持续的免费增值模式
技术栈
核心框架
- Flutter 3.6+ – 跨平台的优秀体验
- Dart – 现代、类型安全的语言
- Material 3 – 最新的 Material Design 指南
本地数据库
- Drift 2.24 – 类型安全的 SQLite,支持响应式查询(实时更新的革命性技术)
安全
- AES‑256 加密 – 使用
encrypt包 - Flutter Secure Storage – 安全的密钥管理
- Local Auth – 生物识别认证(指纹/Face ID)
状态管理与架构
- Riverpod 3.0 – 现代响应式状态管理
- Go Router – 声明式导航
- GetIt – 依赖注入
云端与后端
- Firebase Authentication – Google 登录
- Custom FastAPI Backend – 云同步与使用跟踪
我最自豪的功能
1. 多种笔记类型
不不仅仅是纯文本。Pinpoint 支持:
- 富文本笔记(带格式)
- 音频录音(带播放控制)
- 待办清单(实时自动保存)
- 提醒(时区感知通知)
2. 玻璃拟态 UI
我在这上面花了太多时间,但应用中遍布的磨砂玻璃效果让人感觉 恰到好处。再加上五种强调色主题(薄荷、鸢尾、玫瑰、琥珀、海洋)和流畅的动画,使用体验真的很愉快。
// Example: Glassmorphism container
Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.1),
borderRadius: BorderRadius.circular(24),
border: Border.all(color: Colors.white.withOpacity(0.2)),
),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
child: /* content */,
),
);
3. 真正的端到端加密
笔记在设备上加密后才会离开手机。加密密钥来源于你的主密码并安全存储——我永远看不到你的笔记。
4. OCR 与语音转录
使用 Google ML Kit,你可以从图像中提取文字。语音转文字功能让你在不方便打字时快速口述笔记。
5. 免费增值模式
基于公平使用的模式:
| 功能 | 免费 | 高级 |
|---|---|---|
| 同步笔记 | 50 | 无限 |
| OCR 扫描 | 20 /每月 | 无限 |
| 导出 | 10 /每月 | 无限 |
| 语音录音 | 2 分钟 | 无限 |
| 文件夹 | 5 | 无限 |
使用情况会在本地和后端同时追踪,以防止绕过限制。
Source:
架构决策
带服务层的清晰架构
基于服务的架构将业务逻辑与 UI 分离:
lib/
├── screens/ # UI 界面
├── components/ # 可复用的 UI 组件
├── services/ # 业务逻辑层
├── database/ # Drift 数据库
├── entities/ # 数据库表
├── design_system/ # 颜色、排版、主题
└── navigation/ # Go Router 配置
数据库模式(Drift)
该模式支持多对多的文件夹关系:
# 简化的模式
tables:
- notes:
columns: [id, title, content, type, encryption, timestamps]
- note_folders:
columns: [id, title]
- note_folder_relations:
columns: [note_id, folder_id]
- note_todo_items:
columns: [id, note_id, title, is_done]
- note_attachments:
columns: [id, note_id, file_path, type]
基于流的响应式
Drift 的 watch 查询让实时更新变得轻而易举:
Stream<List<Note>> watchAllNotes() {
return (select(notes)
..orderBy([(t) => OrderingTerm.desc(t.updatedAt)]))
.watch();
}
我面临的挑战
- Google Play Billing Integration – 设置应用内订阅非常痛苦。面对基础计划、优惠和标签,我花了整整一周才弄清术语。专业提示:在开始编码前阅读 Google 文档三遍。
- Cloud Sync Conflicts – 当同一条笔记在两台离线设备上被编辑时,哪个版本会生效?我实现了基于时间戳的“后写入胜出”策略,但这仍是我想改进的地方。
- Todo List Auto‑Save – 让待办事项自动保存且不丢失用户光标位置或产生竞争条件比预期更棘手。我最终使用防抖并为未保存的项目分配临时 ID。
接下来是什么?
- 协作 – 与他人共享笔记
- 标签系统 – 超越仅仅是文件夹
- Markdown 编辑器 – 完整的 Markdown 支持
- iOS 发布 – App Store 部署
- 网页剪辑器 – 直接从浏览器保存内容
试一试!
如果你在寻找一款在不牺牲功能的前提下尊重隐私的笔记应用,试试 Pinpoint 吧:
Pinpoint
这个应用是开源的,欢迎随意查看代码、提交 Issue 或者贡献代码。期待听到你的反馈!
Wrapping Up
构建 Pinpoint 让我学到了很多关于 Flutter、加密、云架构以及真正发布产品所需的经验。如果你正考虑自己开发应用,我的建议很简单:直接开始。学习就在实践中发生。
感谢阅读!如果你对实现细节有疑问,或希望我深入探讨某个具体部分,欢迎留言。
Tags: #flutter #dart #mobile #opensource #privacy