我如何构建了一个 Flutter + Gemini AI 应用来‘Hack’我的大学考勤(开源)

发布: (2026年1月4日 GMT+8 01:59)
6 分钟阅读
原文: Dev.to

Source: Dev.to

如果你是像我一样在莫拉图瓦大学的工程专业学生,你一定了解 80 % 规则 的恐怖。

这很简单的数学公式: 出勤率达到 80 % 或被禁止参加考试。
实际上,这是一场噩梦。

  • “如果我今天逃课,我的出勤率会降到 79.9 % 吗?”
  • “老师会把那天的病假算进去吗?”
  • “我还能睡懒觉吗?”

我常常在凌晨 2 点做复杂的代数运算,只是为了决定是否可以缺掉早上的课程。我需要一个不仅能 记录 习惯,而是能够 为我制定策略 的工具。

于是我打造了 The 80 Percent

下面是我使用 FlutterGoogle Gemini AI 以及高度优化的 Firebase 后端(全部在免费套餐内)构建的全栈解决方案的完整演示。

1. 策略引擎:“安全跳过”逻辑

大多数习惯追踪器只会说 “你当前是 75 %。” 这信息毫无用处。我需要 可操作的建议

“缓冲”公式

如果你的出勤率高于目标,还能缺席多少堂课才会进入危险区?

// The Magic Formula
int calculateSafeSkips(int present, int total, double target) {
  // Formula: floor((present / target) - total)
  int skips = ((present / target) - total).floor();
  return skips < 0 ? 0 : skips;
}

情景: 你参加了 18/20 节课。目标 = 80 %。
结果: 你可以安全地再缺席 2 节课。

为什么重要: 它可以防止学生因恐慌而参加不必要的课程,避免倦怠。

“恢复”公式

如果你 表现不佳,需要连续参加多少堂课才能重新达到安全状态?

// The Recovery Formula
int calculateRecovery(int present, int total, double target) {
  // Formula: ceil((target * total - present) / (1 - target))
  return ((target * total - present) / (1 - target)).ceil();
}

这点至关重要,因为当学生的出勤率为 70 % 时,需要 准确 知道何时能够再次安全。

2. AI 挑战:使用 Gemini 2.5 解析课程表

任何学生应用中最大的摩擦点是 设置。没有人想手动输入 15 门课程及其时间段。

为什么选择 Gemini 2.5 Flash?

原因好处
速度 & 成本适合免费学生应用——低延迟、低成本推理。
多模态智能可直接接受 PDF/图片输入。
零样本能力无需冗长的 few‑shot 示例;只需一个结构良好的系统指令即可。

实现(零样本提示)

final model = GenerativeModel(
  model: 'gemini-2.5-flash',
  apiKey: apiKey,
);

final prompt = """
You are an intelligent assistant that extracts university timetable data.
**GOAL**: Extract timetable metadata, modules, and classes into structured JSON.
**SCHEMA**:
{
  "modules": [{"code": String, "name": String, ...}],
  "classes": [{"day": String, "time": String, "location": String, ...}]
}
""";

final response = await model.generateContent([
  Content.text(prompt),
  Content.data('image/png', timetableImageBytes),
]);

应用会解析 JSON 响应并批量写入本地数据库中的课程信息。此 “零样本” 方法保持请求负载小且响应快速。

3. 架构:在 Firebase 免费层中生存

作为学生,我的预算为 $0。Firebase 很棒,但 Firestore 的限制(每天 50 000 次读取)是个陷阱。如果有 500 名用户每天打开应用 10 次并各获取 10 条记录,你将在第 1 天就用完配额。

我的 “离线‑优先” 方案

组件功能说明
本地缓存在启动时立即从设备加载数据。
懒同步仅在用户明确更改内容时(例如标记出勤)才写入 Firestore。
数据库不存图片跳过头像同步,以避免付费的 “Blaze” 计划或笨重的 Base64 方案。

使用仓库模式,应用可以在不花一分钱的情况下扩展到数千用户。

4. 结果:可投入生产的 Beta

“80 %” 不仅是一个计算器;它是一个全栈学术工具。

  • 技术栈: Flutter、Firebase Auth / Firestore、Provider、Gemini API。
  • 状态: 开源且 Beta 已上线。

构建这个项目让我明白 工程是关于权衡取舍——我为了稳定性(免费层限制)牺牲了花哨的功能(云端图片),并用精确的数学取代了简单的逻辑,使得应用真正有用。

截图

80 %截图

试用

我正在寻找来自其他开发者和学生的反馈。

  • 👉 Notion 文档 (原文链接被截断;可在可用时替换为正确的 URL)

欢迎克隆仓库、提交问题或提出改进建议!

[The 80% Attendance Strategy for Undergrads](https://ill-grenadilla-8a4.notion.site/The-80-Attendance-Strategy-for-Undergrads-2d4d8852a123808c900cd5c78f7de104?pvs=74)

👉 [Demo code and APK file](https://github.com/inusha-thathsara/attendance-tracker-demo/tree/main)

*(Star the repo if you think the project is cool! ⭐)*
Back to Blog

相关文章

阅读更多 »

RGB LED 支线任务 💡

markdown !Jennifer Davishttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex:我为何构建

介绍 大家好。今天我想分享一下我是谁、我在构建什么以及为什么。 早期职业生涯与倦怠 我在 17 年前开始我的 developer 生涯……