一个有意思的闹钟APP
我想要一个可以直接安装在手机上的闹钟程序,名字就叫“摔碗猫”,主界面是一只猫拿着一个碗,可以监控手机屏幕使用时间,早晨叫起床,晚上催睡觉,可以设置起床和休息时间,碗的个数,拖延就导致小猫摔碗,摔的碗放进回收箱,记录摔了几个碗。以下是deepseek帮忙规划的:下面是一个完整的手机小程序“凿碗猫”的实现方案,使用Flutter框架开发(支持Android/iOS),包含所有核心功能:---### 一、功能设计
1. **主界面**
- 动态猫咪动画(手持碗)
- 实时显示剩余碗数
- 屏幕使用时间统计(今日/本周)
- 回收箱入口(显示已摔碗数)2. **监控逻辑**
- ⏰ **早晨闹钟**:在设定时间播放猫叫声闹铃
- 🌙 **睡眠监测**:超过设定睡眠时间使用手机→触发摔碗
- 🕒 **拖延惩罚**:每次拖延摔1个碗(动画效果+碎碗音效)
- 🔄 **每日重置**:早晨自动补满碗3. **数据存储**
- 本地保存:起床眠时间、碗总数、摔碗记录
- 历史统计:按日/周/月显示摔碗趋势---### 二、技术实现方案
```dart
// 核心依赖
dependencies:
flutter_local_notifications: ^13.0.0 // 闹钟通知
screen_time: ^0.1.2 // 屏幕使用时间监控
shared_preferences: ^2.0.15 // 本地存储
lottie: ^2.0.0 // 猫咪动画
audioplayers: ^3.0.1 // 音效播放
```#### 核心代码结构:
```dart
// 1. 主界面 - main_screen.dart
class MainScreen extends StatefulWidget {
@override
_MainScreenState createState() => _MainScreenState();
}class _MainScreenState extends State<MainScreen> {
int bowlsLeft = 5;
int brokenBowls = 0;
Duration screenTimeToday = Duration.zero; @override
void initState() {
_loadSettings();
_startMonitoring();
super.initState();
} void _startMonitoring() {
// 每5分钟检查一次
Timer.periodic(Duration(minutes: 5), (timer) {
_checkSleepTime();
_updateScreenTime();
});
} void _checkSleepTime() {
if (DateTime.now().isAfter(sleepTime)) {
if (ScreenTime.isUsingPhone()) {
_breakBowl(); // 触发摔碗
}
}
} void _breakBowl() {
if (bowlsLeft > 0) {
setState(() {
bowlsLeft--;
brokenBowls++;
});
// 播放碎碗音效
AudioPlayer().play(AssetSource('glass_break.mp3'));
// 更新存储
Prefs.saveBowls(brokenBowls, bowlsLeft);
}
} // 早晨重置碗数
void _resetBowls() {
setState(() {
bowlsLeft = totalBowls;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
// 猫咪Lottie动画
Lottie.asset('assets/cat_holding_bowl.json'),
// 碗计数器
Positioned(
top: 20,
child: Text('$bowlsLeft/$totalBowls', style: TextStyle(fontSize: 24)),
),
// 回收箱按钮
Positioned(
bottom: 20,
child: IconButton(
icon: Stack(children: [
Icon(Icons.delete),
Text('$brokenBowls', style: TextStyle(color: Colors.red))
]),
onPressed: () => Navigator.push(...),
),
)
],
),
);
}
}// 2. 后台服务 - background_service.dart
class BackgroundService {
static void scheduleAlarms() {
// 设置早晨闹钟
FlutterLocalNotificationsPlugin().zonedSchedule(
0,
'喵!该起床啦!',
'碗已经补满,开始新的一天吧~',
_nextAlarmTime(),
NotificationDetails(...),
uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
androidAllowWhileIdle: true,
matchDateTimeComponents: DateTimeComponents.time,
payload: 'alarm'
);
}
static void checkSleepViolation() {
// 从本地获取睡眠时间设置
final sleepTime = Prefs.getSleepTime();
if (DateTime.now().isAfter(sleepTime)) {
final usage = ScreenTime.getTodayUsage();
if (usage > Duration(minutes: 5)) {
// 触发摔碗逻辑
EventBus.emit('break_bowl');
}
}
}
}// 3. 设置页面 - settings_screen.dart
class SettingsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
TimePicker('起床时间', onChanged: (time) => Prefs.saveWakeTime(time)),
TimePicker('睡觉时间', onChanged: (time) => Prefs.saveSleepTime(time)),
Slider(
min: 3,
max: 10,
label: "碗的数量: ${Prefs.getTotalBowls()}",
onChanged: (v) => Prefs.saveTotalBowls(v.toInt())
),
],
);
}
}
```---### 三、核心功能实现细节
1. **猫咪动画**
- 使用Lottie制作逐帧动画:
- 正常状态:猫咪抱着碗摇晃尾巴
- 摔碗状态:碗碎裂→猫咪委屈表情
- 动画资源:[免费猫咪动画模板](https://lottiefiles.com/search?q=cat)2. **屏幕时间监控**
```dart
// 获取当日使用时间
Future<Duration> getTodayUsage() async {
final usage = await ScreenTime.getScreenTime();
return usage;
}
```3. **摔碗惩罚系统**
- 每次检测到超时:减少碗数 + 播放动画
- 碎碗进入回收箱(带时间戳记录)
- 每日7:00自动重置碗数4. **数据持久化**
```dart
// 存储示例
class Prefs {
static Future<void> saveBowls(int broken, int left) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('broken_bowls', broken);
await prefs.setInt('left_bowls', left);
}
}
```---### 四、UI设计要点
| 区域 | 设计说明 |
|--------------|---------------------------------|
| **猫咪区域** | 占据屏幕70%区域,Lottie动画循环播放 |
| **碗计数器** | 右上角显示 `3/5` (当前/总数) |
| **回收箱** | 底部垃圾桶图标 + 红色角标数字 |
| **设置入口** | 左上角齿轮图标 → 时间/碗数设置 |---### 五、特殊场景处理
1. **多日未重置**
- 如果连续3天未按时起床 → 猫咪变成脏兮兮状态
2. **成就系统**
- 连续7天不摔碗 → 解锁金色猫碗皮肤
3. **数据同步**
APP原生开发唐山市