This commit is contained in:
ytc1012
2025-11-24 09:31:08 +08:00
parent 8c61688a26
commit 149d1ed6cd
11 changed files with 99 additions and 2298 deletions

View File

@@ -1,443 +0,0 @@
# 🎨 FocusBuddy App Icon Design
**Date**: 2025-11-22
**Status**: Design specification ready
---
## 🎯 Design Concept
### Core Message
The icon should convey:
- **Focus**: Centered, calm attention
- **Gentleness**: Soft, non-intimidating
- **Support**: A friendly companion, not a strict taskmaster
### Design Direction
**"Gentle Focus Circle"** - A minimalist icon featuring concentric circles representing focused attention, with a soft color palette matching the app's Morandi aesthetic.
---
## 🎨 Visual Design
### Primary Design Option: Focused Circle
```
┌─────────────────────┐
│ │
│ ╭───────╮ │
│ ╭─────────────╮ │
│ │ ◉ ◉ │ │ <- Friendly "buddy" face
│ │ ⌣ │ │ (subtle, optional)
│ ╰─────────────╯ │
│ ╰───────╯ │
│ │
└─────────────────────┘
```
**Elements**:
1. **Outer circle**: Soft gradient (#A7C4BC to #88C9A1)
2. **Inner circle**: Lighter shade (#F8F6F2)
3. **Center dot**: Primary color (#A7C4BC)
4. **Optional**: Subtle friendly face (two dots for eyes, gentle curve for smile)
### Alternative Design: Timer Symbol
```
┌─────────────────────┐
│ │
│ ⏰ │
╲ │
│ │ 12 │ │ <- Minimalist clock
│ ╲___ │ showing focus time
│ │
└─────────────────────┘
```
---
## 🎨 Color Specifications
### Primary Palette (from app_colors.dart)
```dart
Background: #F8F6F2 // Warm off-white
Primary: #A7C4BC // Calm green
Success: #88C9A1 // Encouraging green
Text: #5B6D6D // Soft gray
```
### Icon Color Strategy
**Option A - Gradient Background**:
- Background: Gradient from #A7C4BC (top) to #88C9A1 (bottom)
- Center: #F8F6F2
- Details: #5B6D6D
**Option B - Solid Background**:
- Background: #A7C4BC
- Center circle: #F8F6F2
- Accent: #88C9A1
---
## 📐 Technical Requirements
### iOS Requirements
| Size | Usage | File Name |
|------|-------|-----------|
| 1024×1024 | App Store | `AppIcon-1024.png` |
| 180×180 | iPhone 3x | `AppIcon-180.png` |
| 120×120 | iPhone 2x | `AppIcon-120.png` |
| 167×167 | iPad Pro | `AppIcon-167.png` |
| 152×152 | iPad 2x | `AppIcon-152.png` |
| 76×76 | iPad 1x | `AppIcon-76.png` |
### Android Requirements
| Size | Density | Folder |
|------|---------|--------|
| 192×192 | xxxhdpi | `mipmap-xxxhdpi` |
| 144×144 | xxhdpi | `mipmap-xxhdpi` |
| 96×96 | xhdpi | `mipmap-xhdpi` |
| 72×72 | hdpi | `mipmap-hdpi` |
| 48×48 | mdpi | `mipmap-mdpi` |
| 512×512 | Play Store | `playstore-icon.png` |
### Design Guidelines
- **iOS**: No transparency, no rounded corners (iOS adds them automatically)
- **Android**: Can have transparency, adaptive icons recommended
- **Safe area**: Keep important elements within 80% of canvas (avoid edges)
- **Contrast**: Ensure icon is visible on both light and dark backgrounds
---
## 🛠️ Design Tools & Resources
### Option 1: Figma (Recommended)
**Steps**:
1. Go to [Figma](https://www.figma.com) (free account)
2. Create new file (1024×1024 canvas)
3. Use the design specifications above
4. Export all required sizes
**Figma Template** (you can recreate):
```
Frame: 1024×1024
├─ Background Rectangle (fill: linear gradient #A7C4BC → #88C9A1)
├─ Outer Circle (800×800, center aligned)
│ ├─ Fill: #A7C4BC
│ └─ Opacity: 90%
├─ Inner Circle (600×600, center aligned)
│ ├─ Fill: #F8F6F2
│ └─ Shadow: 0 4 20 rgba(0,0,0,0.1)
└─ Center Dot (200×200, center aligned)
├─ Fill: #A7C4BC
└─ Optional: Friendly face elements
```
### Option 2: Canva
**Steps**:
1. Go to [Canva](https://www.canva.com)
2. Create custom size: 1024×1024
3. Search templates: "app icon minimal"
4. Customize with FocusBuddy colors
5. Download as PNG
### Option 3: Icon Generator Tools
**Online Tools**:
- [App Icon Generator](https://appicon.co/) - Upload 1024×1024, generates all sizes
- [IconKitchen](https://icon.kitchen/) - Android adaptive icons
- [MakeAppIcon](https://makeappicon.com/) - Generates iOS and Android sets
---
## 🎨 Detailed Design Specs
### Design 1: Minimalist Focus Circle
**SVG-like Description**:
```xml
<svg viewBox="0 0 1024 1024">
<!-- Background gradient -->
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#A7C4BC"/>
<stop offset="100%" style="stop-color:#88C9A1"/>
</linearGradient>
</defs>
<!-- Background -->
<rect width="1024" height="1024" fill="url(#bg)"/>
<!-- Outer circle (focus ring) -->
<circle cx="512" cy="512" r="400"
fill="none" stroke="#F8F6F2" stroke-width="60"/>
<!-- Inner circle -->
<circle cx="512" cy="512" r="280" fill="#F8F6F2" opacity="0.95"/>
<!-- Center dot (the "focus point") -->
<circle cx="512" cy="512" r="80" fill="#A7C4BC"/>
<!-- Optional: Friendly face -->
<!-- Left eye -->
<circle cx="452" cy="480" r="20" fill="#5B6D6D" opacity="0.7"/>
<!-- Right eye -->
<circle cx="572" cy="480" r="20" fill="#5B6D6D" opacity="0.7"/>
<!-- Gentle smile (arc) -->
<path d="M 452 540 Q 512 570 572 540"
stroke="#5B6D6D" stroke-width="12"
fill="none" opacity="0.7" stroke-linecap="round"/>
</svg>
```
### Design 2: Timer with Focus
**Description**:
```
- Background: Solid #A7C4BC
- Clock circle: #F8F6F2, 700×700
- Clock hands: #5B6D6D
- Hour hand pointing at 12 (straight up)
- Minute hand at 25 (Pomodoro reference)
- Center dot: Small circle #A7C4BC
- Shadow: Subtle drop shadow for depth
```
---
## 📝 Design Checklist
### Before Creating
- [ ] Review app's color scheme (app_colors.dart)
- [ ] Decide on primary design concept
- [ ] Sketch rough ideas on paper (optional)
### During Design
- [ ] Create 1024×1024 master file
- [ ] Use exact color codes from app
- [ ] Ensure visibility at small sizes (test at 48×48)
- [ ] Keep design simple and recognizable
- [ ] Test on light and dark backgrounds
### After Design
- [ ] Export 1024×1024 PNG (for iOS App Store)
- [ ] Generate all required iOS sizes
- [ ] Generate all required Android sizes
- [ ] Test icon appearance on real devices (if possible)
- [ ] Update Xcode assets (ios/Runner/Assets.xcassets)
- [ ] Update Android resources (android/app/src/main/res)
---
## 🚀 Quick Start Guide
### Fastest Method: Use Figma
1. **Create Master Icon** (15 minutes)
```
1. Go to figma.com → New file
2. Press 'F' for frame tool
3. Enter dimensions: 1024×1024
4. Create the design using shapes (circles, rectangles)
5. Apply colors from the spec above
```
2. **Export Master** (2 minutes)
```
1. Select the frame
2. Right panel → Export
3. Format: PNG, 1x
4. Click Export
5. Save as: icon-1024.png
```
3. **Generate All Sizes** (5 minutes)
```
1. Go to appicon.co
2. Upload icon-1024.png
3. Select iOS and Android
4. Download generated assets
5. Unzip the files
```
4. **Install Icons** (10 minutes)
- See installation instructions below
---
## 📦 Installation Instructions
### iOS Installation
1. **Locate Assets Folder**:
```
ios/Runner/Assets.xcassets/AppIcon.appiconset/
```
2. **Replace Files**:
- Copy all generated iOS icons to this folder
- Ensure file names match Contents.json
3. **Update Contents.json** (if needed):
```json
{
"images": [
{
"size": "20x20",
"idiom": "iphone",
"filename": "Icon-20@2x.png",
"scale": "2x"
},
// ... more entries
]
}
```
4. **Build and Test**:
```bash
flutter clean
flutter build ios
```
### Android Installation
1. **Locate Resource Folders**:
```
android/app/src/main/res/
├── mipmap-mdpi/
├── mipmap-hdpi/
├── mipmap-xhdpi/
├── mipmap-xxhdpi/
└── mipmap-xxxhdpi/
```
2. **Replace ic_launcher.png**:
- Copy the corresponding size to each folder
- Name all files: `ic_launcher.png`
3. **Update for Adaptive Icons** (Optional):
- Create `mipmap-anydpi-v26/ic_launcher.xml`
- Reference foreground and background layers
4. **Build and Test**:
```bash
flutter clean
flutter build apk
```
---
## 🎨 Design Recommendations
### Do's ✅
- Keep it simple and recognizable
- Use the app's color palette
- Test visibility at small sizes
- Ensure contrast with backgrounds
- Make it friendly and approachable
### Don'ts ❌
- Don't use text (hard to read at small sizes)
- Don't use complex gradients (may not scale well)
- Don't use thin lines (invisible at 48×48)
- Don't copy other apps' icons
- Don't use photos or realistic images
---
## 🔍 Testing Your Icon
### Visual Tests
1. **Size Test**: View at 48×48 - is it still recognizable?
2. **Background Test**: Place on white, black, and colored backgrounds
3. **Neighboring Test**: View alongside other popular apps
4. **Quick Glance Test**: Can you identify it in 1 second?
### Technical Tests
```bash
# iOS: Check in simulator
flutter run -d "iPhone 15 Pro"
# Android: Check on device
flutter install
```
---
## 💡 Design Philosophy
**FocusBuddy Icon Should Feel**:
- 🧘 **Calm**: Soft colors, rounded shapes
- 🤝 **Supportive**: Friendly, non-threatening
- 🎯 **Focused**: Clear center point, minimal distractions
- 💚 **Gentle**: Morandi palette, no harsh contrasts
**Avoid**:
- ⚠️ Aggressive colors (bright red, harsh orange)
- ⚠️ Sharp angles (intimidating)
- ⚠️ Complicated details (confusing)
- ⚠️ Dark/depressing tones (discouraging)
---
## 📚 Resources
### Color Inspiration
- Current app palette: Morandi tones, calm greens
- Reference: Calm app, Headspace (but make it unique!)
### Design Inspiration
- Search "minimalist app icon" on Dribbble
- Look at productivity app icons on App Store
- Browse "focus timer" apps for ideas
### Tools
- **Figma**: https://www.figma.com (free)
- **Canva**: https://www.canva.com (free)
- **AppIcon.co**: https://appicon.co (free generator)
- **IconKitchen**: https://icon.kitchen (Android adaptive)
---
## 🎯 Next Steps
1. **Design the Icon** (20-30 minutes)
- Use Figma or Canva
- Follow the specifications above
- Export 1024×1024 PNG
2. **Generate All Sizes** (5 minutes)
- Use AppIcon.co to generate all required sizes
- Download the zip file
3. **Install in Project** (10 minutes)
- Replace iOS assets
- Replace Android resources
- Test on simulators/devices
4. **Document** (5 minutes)
- Save master file for future updates
- Note any design decisions
- Take screenshots for app store
---
## 📝 Final Checklist
- [ ] Master icon created (1024×1024)
- [ ] All iOS sizes generated
- [ ] All Android sizes generated
- [ ] iOS assets installed
- [ ] Android resources installed
- [ ] Tested on iOS simulator
- [ ] Tested on Android emulator/device
- [ ] Icon looks good at small size (48×48)
- [ ] Icon matches app's design language
- [ ] Master file saved for future updates
---
**Time Estimate**: 30-60 minutes total
**Difficulty**: Beginner-friendly
**Tools Needed**: Browser (Figma/Canva), no design experience required
**Ready to design?** Follow the "Quick Start Guide" section above!

View File

@@ -1,511 +0,0 @@
# 🎉 FocusBuddy - 最终开发总结
**完成日期**: 2025年11月22日
**状态**: ✅ MVP 已完成 99%
---
## 🏆 成就解锁
### ✅ 已完成的所有功能
#### 1. **核心专注功能**
- ⏱️ 倒计时器(精确到秒)
- ⏸️ 暂停/恢复
- 🛑 提前停止(友好确认)
- 🔄 可配置时长15/25/45分钟
#### 2. **分心追踪系统**
- 🤚 "I got distracted" 按钮(不中断计时!)
- 📊 4种分心类型分类
- 💬 温柔鼓励反馈
- 📈 分心统计记录
#### 3. **数据管理**
- 💾 本地持久化存储Hive
- 📅 按日期分组查看
- 📊 今日统计汇总
- 🔢 会话详细记录
#### 4. **完整页面系统**
- 🏠 Home Screen动态时长显示
- ⏰ Focus Screen计时器 + 分心追踪)
- ✨ Complete Screen统计 + 鼓励)
- 📜 History Screen历史记录
- ⚙️ Settings Screen设置管理
#### 5. **用户体验**
- 🎨 莫兰迪配色(温柔柔和)
- 💬 15条随机鼓励文案
- 🚀 流畅页面导航
- 📱 响应式设计
#### 6. **本地通知系统** ✨ 新增
- 🔔 专注完成通知
- 📱 Android 13+ 权限支持
- 🍎 iOS 运行时权限请求
- 🌐 Web 平台优雅降级
- 📊 基于分心次数的智能文案
#### 7. **字体优化** ✨ 新增
- 🎨 Google Fonts (Nunito) 集成
- 📦 自动从 CDN 下载并缓存
- 🔤 5种字重支持Light/Regular/SemiBold/Bold/ExtraBold
- 🌍 跨平台一致性
---
## 📊 项目统计
```
总代码行数: 1,680+ 行 (+400)
文件数量: 15 个 (+1 notification_service.dart)
页面数量: 5 个
数据模型: 2 个
服务类: 4 个 (+1)
依赖包: 8 个 (+1 google_fonts)
```
### 代码质量
- ✅ 结构清晰models/services/screens/theme
- ✅ 注释完整
- ✅ 遵循 Flutter 最佳实践
- ✅ Material 3 设计
---
## 🎯 MVP 完成度
```
███████████████████▓ 99%
```
### 已实现99%
- ✅ 所有核心功能
- ✅ 所有核心页面
- ✅ 数据持久化
- ✅ 设置系统
- ✅ 历史记录
- ✅ 本地通知系统Android/iOS
- ✅ Google Fonts (Nunito) 字体
### 待完成1%
- 🎨 自定义应用图标 - **设计规格已完成,等待实现**
- ✅ 3个设计选项已创建
- ✅ 可视化预览 (icon-preview.html)
- ✅ 完整技术文档
- ⏳ 需要在 Figma/Canva 中创建30分钟
- ⏳ 应用商店截图
- ⏳ 真机测试
---
## 🚀 如何运行
### 方式1: Web版推荐最快
```bash
cd f:\cursor-auto\focusBuddy
flutter run -d edge
```
### 方式2: Windows 桌面版
**注意**: 需要启用 Windows 开发者模式
1. 打开设置: `start ms-settings:developers`
2. 启用"开发者模式"
3. 运行: `flutter run -d windows`
### 方式3: Android/iOS
需要连接真机或模拟器:
```bash
flutter devices # 查看可用设备
flutter run -d <device-id>
```
---
## 🧪 完整测试流程
### 1. 设置功能测试
```
1. 打开 App
2. 点击 "Settings"
3. 选择 15 分钟
4. 返回首页
5. ✅ 验证: 显示 "15 minutes"
```
### 2. 专注流程测试
```
1. 点击 "Start Focusing"
2. 等待几秒
3. 点击 "I got distracted"
4. 选择 "📱 Scrolling social media"
5. 看到提示: "It happens. Let's gently come back."
6. 再点击几次分心按钮
7. 点击 "Stop session"
8. 确认停止
9. ✅ 验证: 完成页显示正确统计
```
### 3. 历史记录测试
```
1. 完成至少2次专注
2. 点击 "History"
3. 查看今日总结卡片
4. 查看会话列表
5. ✅ 验证: 数据正确累计
```
### 4. 数据持久化测试
```
1. 完成一次专注
2. 关闭 App
3. 重新打开 App
4. 查看 History
5. ✅ 验证: 数据仍然存在
```
---
## 🎨 设计亮点
### 颜色系统
```dart
Primary: #A7C4BC // 平静的绿色
Background: #F8F6F2 // 温暖的米白
Text: #5B6D6D // 柔和的灰色
Success: #88C9A1 // 鼓励的绿色
```
### 交互设计
- 大按钮56px 高度)
- 圆角设计16px
- 柔和阴影
- 流畅动画300ms
### 文案风格
- "It happens. Let's gently come back."
- "Showing up is half the battle."
- "You came back — that's what matters."
---
## 📁 项目结构
```
lib/
├── main.dart # 应用入口
├── models/ # 数据模型
│ ├── focus_session.dart
│ ├── focus_session.g.dart # Hive 生成
│ └── distraction_type.dart
├── services/ # 业务逻辑
│ ├── storage_service.dart
│ └── encouragement_service.dart
├── screens/ # 页面
│ ├── home_screen.dart
│ ├── focus_screen.dart
│ ├── complete_screen.dart
│ ├── history_screen.dart
│ └── settings_screen.dart
├── theme/ # 主题系统
│ ├── app_colors.dart
│ ├── app_text_styles.dart
│ └── app_theme.dart
└── widgets/ # 可复用组件(暂无)
assets/
└── encouragements.json # 鼓励文案数据
```
---
## 🐛 已知问题
### 1. Windows 开发者模式
**问题**: Windows 需要开发者模式才能运行桌面版
**解决**:
- 方式A: 启用开发者模式
- 方式B: 使用 Web 版测试(推荐)
### 2. ✅ 字体显示 - 已修复
**状态**: ✅ 已完成
**方案**: 集成 Google Fonts自动下载 Nunito
**文档**: `GOOGLE_FONTS_SETUP.md`
### 3. ✅ 静态方法访问 - 已修复
**状态**: ✅ 已完成
**方案**: 将静态方法移到类开头
### 4. ✅ Complete Screen 导航 - 已修复
**状态**: ✅ 已完成
**方案**: "View Full Report" 按钮正确导航到 History
**文档**: `BUG_FIX_001.md`
---
## 🎯 下一步计划
### 今天完成 ✅
- ✅ 所有核心功能
- ✅ 所有核心页面
- ✅ 运行测试Web 版成功)
- ✅ 添加本地通知系统
- ✅ Google Fonts 字体集成
- ✅ Bug 修复Complete Screen 导航)
### 明天任务
1. 🎨 设计应用图标1-2小时
2. 📸 准备应用商店截图1-2小时
3. 🧪 真机测试Android/iOS2-3小时
### 本周任务
1. 📝 完善应用描述
2. 🌐 部署隐私政策页面
3. 📋 填写上架表单
4. 🚀 提交到应用商店
---
## 💡 核心价值实现
### ✅ "无惩罚"机制
> 点击 "I got distracted" 不会:
> - ❌ 停止计时器
> - ❌ 显示红色警告
> - ❌ 扣减分数
> - ✅ 只是温柔地记录并鼓励
### ✅ 情感友好
> 所有文案都经过精心设计:
> - "It happens" (这很正常)
> - "Let's gently come back" (温柔回归)
> - "That's totally fine" (完全没问题)
### ✅ 数据隐私
> 100% 本地存储:
> - 无云同步
> - 无账号系统
> - 无数据上传
> - 无分析追踪
---
## 🌟 项目亮点
### 技术实现
1. **Hive** - 快速本地数据库
2. **SharedPreferences** - 简单设置存储
3. **Material 3** - 现代化 UI
4. **状态管理** - StatefulWidget简单有效
### 用户体验
1. **即时反馈** - 所有操作都有反馈
2. **容错设计** - 提前停止有友好提示
3. **数据可视化** - 清晰的统计展示
4. **流畅导航** - 页面间无缝切换
### 产品差异化
1. **唯一的分心按钮** - 不中断计时
2. **温柔的文案系统** - 鼓励而非批评
3. **完全离线** - 尊重隐私
4. **神经多样性友好** - 为 ADHD 设计
---
## 🎊 里程碑达成
- ✅ Day 1: 项目初始化 + 基础架构
- ✅ Day 1: 核心计时器 + 分心追踪
- ✅ Day 1: 数据存储 + 完成页面
- ✅ Day 1: 历史记录 + 设置页面
- ✅ Day 1: **MVP 95% 完成!**
---
## 🚀 准备发布
### 必须完成
- [ ] 真机测试Android + iOS
- [ ] 修复关键 Bug
- [ ] 准备应用图标1024×1024
- [ ] 编写应用描述
### 建议完成
- [ ] 添加本地通知
- [ ] 下载 Nunito 字体
- [ ] 准备宣传截图
- [ ] 编写用户指南
### 可选完成
- [ ] Onboarding 引导页
- [ ] 深色模式
- [ ] 更多成就徽章
- [ ] 导出 PDF 报告
---
## 📚 相关文档
| 文档 | 用途 |
|------|------|
| [README.md](README.md) | 项目总览 |
| [QUICK_START.md](QUICK_START.md) | 快速启动指南 |
| [PROGRESS_UPDATE.md](PROGRESS_UPDATE.md) | 进度更新 |
| [mvp-launch-checklist.md](mvp-launch-checklist.md) | 上线清单 |
| [product-design.md](product-design.md) | 产品设计 |
| [ui-design-spec.md](ui-design-spec.md) | UI 规范 |
| [NOTIFICATION_IMPLEMENTATION.md](NOTIFICATION_IMPLEMENTATION.md) | 本地通知实现 ✨ |
| [GOOGLE_FONTS_SETUP.md](GOOGLE_FONTS_SETUP.md) | Google Fonts 配置 ✨ |
| [BUG_FIX_001.md](BUG_FIX_001.md) | Bug 修复记录 ✨ |
| [TESTING_START_HERE.md](TESTING_START_HERE.md) | 测试指南 |
| [TEST_REPORT.md](TEST_REPORT.md) | 完整测试报告 |
| [ICON_IMPLEMENTATION_GUIDE.md](ICON_IMPLEMENTATION_GUIDE.md) | App 图标实现指南 ✨ |
| [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md) | App 图标设计规格 ✨ |
| [icon-preview.html](icon-preview.html) | App 图标可视化预览 ✨ |
---
## 💪 团队能力证明
**单日开发成果**:
- 完整的 MVP 应用
- 1,280+ 行生产级代码
- 5 个功能完整的页面
- 完善的数据管理系统
- 精心设计的用户体验
**技术栈掌握**:
- ✅ Flutter 框架
- ✅ Dart 语言
- ✅ Hive 数据库
- ✅ Material Design
- ✅ 状态管理
- ✅ 异步编程
---
## 🎉 最终评价
### 产品质量: ⭐⭐⭐⭐⭐ (5/5)
- 核心功能完整
- 用户体验优秀
- 代码质量高
- 设计优雅
### MVP 完成度: 99%
- 所有核心功能 ✅
- 所有核心页面 ✅
- 数据持久化 ✅
- 本地通知系统 ✅
- 字体优化 ✅
- 仅差图标和截图 ⏳
### 上线准备度: 90%
- 功能完整 ✅
- Web 测试通过 ✅
- 需要真机测试 ⏳
- 需要图标 ⏳
- 需要截图 ⏳
---
## 🎊 恭喜!
**FocusBuddy 从 0 到 99% 的 MVP一天完成**
这是一个功能完整、设计优秀、代码质量高的应用。
已完成:
1. ✅ 所有核心功能实现
2. ✅ 本地通知系统集成
3. ✅ Google Fonts 字体优化
4. ✅ Web 版测试通过
5. ✅ Bug 修复完成
接下来只需要:
1. 🎨 设计应用图标
2. 📸 准备应用商店截图
3. 🧪 真机测试Android/iOS
**你已经创造了一个真正有价值的产品!** 🚀
---
**当前状态**: ✅ Web 版已成功运行!
**下一步**: 按照 TESTING_START_HERE.md 进行功能测试
---
## 🧪 测试文档
已创建完整的测试文档:
1. **[TESTING_START_HERE.md](TESTING_START_HERE.md)** - 快速测试指南10分钟
- 10个核心测试流程
- 最关键测试:分心按钮不能暂停计时器!
- 常见问题解答
- Hot Reload 命令
2. **[TEST_REPORT.md](TEST_REPORT.md)** - 完整测试报告2-3小时
- 20个详细测试用例
- 每个功能的验收标准
- Bug 追踪模板
- 多平台测试计划
---
## 🎯 立即开始测试
### 最快速测试5分钟
1. 打开 Edge 浏览器(应该已经自动打开)
2. 测试核心流程:
```
Home → Settings (改15分钟) → 返回
Home → Start Focusing
点击 "I got distracted" 3次 ⚠️ 确认计时器继续运行
点击 "Stop session" → 确认
查看 History → 验证数据已保存
```
3. 如果以上全部正常 → **MVP 测试通过!** ✅
### 测试命令(在终端中)
```bash
r # 热重载(保持状态)
R # 完全重启(重置状态)
c # 清空控制台
q # 退出应用
```
---
## 📊 开发完成度更新
```
███████████████████▓ 95% → 99%
```
### 新完成项2025-11-22 最新)
- ✅ Web 版成功运行
- ✅ 数据库初始化成功
- ✅ 创建完整测试文档30个测试用例
- ✅ Hot Reload 已启用
-**本地通知系统完整实现**+200行代码
-**Google Fonts (Nunito) 集成**
-**Complete Screen 导航 Bug 修复**
-**所有 const 关键字冲突已修复**
### 待完成1%
- ⏳ 设计应用图标1024×1024
- ⏳ 准备应用商店截图
- ⏳ 真机测试Android/iOS
---
**祝贺你完成了 FocusBuddy 的核心开发!** 🎉
**现在可以开始测试了 →** 查看 [TESTING_START_HERE.md](TESTING_START_HERE.md)

View File

@@ -1,40 +0,0 @@
# Nunito Font Download Instructions
## Option 1: Download from Google Fonts (Recommended)
1. Visit: https://fonts.google.com/specimen/Nunito
2. Click "Download family"
3. Extract the ZIP file
4. Copy these font files to `assets/fonts/`:
- Nunito-Light.ttf (weight 300)
- Nunito-Regular.ttf (weight 400)
- Nunito-SemiBold.ttf (weight 600)
- Nunito-Bold.ttf (weight 700)
- Nunito-ExtraBold.ttf (weight 800)
## Option 2: Use Google Fonts Package (Alternative)
If you don't want to download fonts manually, you can use the `google_fonts` package:
1. Add to pubspec.yaml:
```yaml
dependencies:
google_fonts: ^6.1.0
```
2. Update `lib/theme/app_text_styles.dart` to use GoogleFonts:
```dart
import 'package:google_fonts/google_fonts.dart';
static final appTitle = GoogleFonts.nunito(
fontSize: 24,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
);
```
## Current Status
⚠️ **Action Required**: Please download the Nunito font files and place them in `assets/fonts/`
Until then, the app will use the system default font.

View File

@@ -1,185 +0,0 @@
# 🎨 Google Fonts (Nunito) - 实现总结
**日期**: 2025-11-22
**状态**: ✅ 95% 完成需要清理const关键字
---
## ✅ 已完成
### 1. 添加 Google Fonts 依赖
```yaml
dependencies:
google_fonts: ^6.1.0 # Google Fonts (Nunito)
```
✅ 已安装并可用
### 2. 更新主题文件
-`app_text_styles.dart` - 所有样式使用 `GoogleFonts.nunito()`
-`app_theme.dart` - 默认字体族使用 Google Fonts
### 3. 优点
- 自动从 Google 服务器下载字体
- 无需手动管理字体文件
- 支持所有字重Light, Regular, SemiBold, Bold, ExtraBold
- 跨平台一致性
---
## ⚠️ 待修复
### 编译错误const 关键字冲突
**问题**Google Fonts 返回的 TextStyle 不是 const但代码中使用了 `const Text(...style: AppTextStyles...)`
**错误示例**:
```dart
const Text(
'FocusBuddy',
style: AppTextStyles.appTitle, // ❌ appTitle 不是 const
)
```
**修复方法**:删除 const 关键字
```dart
Text(
'FocusBuddy',
style: AppTextStyles.appTitle, // ✅ 正确
)
```
### 需要修复的文件和行数
根据编译器输出,以下位置仍需修复:
#### home_screen.dart
- [ ] 第 49 行 - `const Text('FocusBuddy', style: AppTextStyles.appTitle)`
- [ ] 第 115 行 - `const Text("Tap 'I got distracted'...", style: AppTextStyles.helperText)`
#### history_screen.dart
- [ ] 第 86 行 - `const Text('No focus sessions yet', style: AppTextStyles.headline)`
- [ ] 第 92 行 - `const Text('Start your first session...', style: AppTextStyles.helperText)`
#### settings_screen.dart
- [ ] 第 63 行 - `const Padding(...child: Text(...style: AppTextStyles.bodyText))`
- [ ] 第 84 行 - `title: const Text('Privacy Policy', style: AppTextStyles.bodyText)`
- [ ] 第 100 行 - `title: const Text('About FocusBuddy', style: AppTextStyles.bodyText)`
- [ ] 第 251 行 - `content: const SingleChildScrollView(...style: AppTextStyles.bodyText)`
- [ ] 第 276 行 - `content: const SingleChildScrollView(...style: AppTextStyles.bodyText)`
#### complete_screen.dart
- [ ] 第 46 行 - `const Text('You focused for', style: AppTextStyles.headline)`
---
## 🛠️ 快速修复脚本
### 手动修复步骤
1. 打开每个文件
2. 搜索 `const Text(``const Padding(`
3. 如果该 Widget 使用了 `AppTextStyles.*`,删除 `const` 关键字
4. 保存文件
### 或使用正则表达式查找替换VSCode
**查找**:
```regex
const (Text|Padding)\(([^)]*style: AppTextStyles\.)
```
**替换**:
```
$1($2
```
---
## 🎯 测试方法
修复完成后:
```bash
# 1. 清理构建缓存
flutter clean
# 2. 重新获取依赖
flutter pub get
# 3. 运行应用
flutter run -d edge
# 4. 验证字体加载
# 打开浏览器开发者工具F12
# 在 Network 标签查看是否有 Nunito 字体请求
```
---
## 📊 字体配置详情
### 使用的字体变体
| 字重 | 用途 | 代码位置 |
|------|------|----------|
| Light (300) | Helper text | `helperText` |
| Regular (400) | Body text, quotes | `bodyText`, `encouragementQuote` |
| SemiBold (600) | Headlines, buttons | `headline`, `buttonText` |
| Bold (700) | App title, large numbers | `appTitle`, `largeNumber` |
| ExtraBold (800) | Timer display | `timerDisplay` |
### Google Fonts CDN
字体自动从以下来源加载:
```
https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600;700;800
```
首次加载后会缓存到本地,后续离线也可用。
---
## 🚀 完成清单
- [x] 添加 google_fonts 依赖
- [x] 更新 app_text_styles.dart
- [x] 更新 app_theme.dart
- [ ] 删除所有const关键字剩余10处
- [ ] 测试字体渲染
- [ ] 验证所有字重正确显示
---
## 💡 备用方案
如果 Google Fonts 在某些环境无法使用:
### 方案 A: 手动下载字体
1. 从 Google Fonts 下载 Nunito
2. 放到 `assets/fonts/` 目录
3. 在 pubspec.yaml 配置
4. 回退到硬编码 `fontFamily: 'Nunito'`
### 方案 B: 使用系统字体
1. 删除所有 `fontFamily` 设置
2. 依赖系统默认字体
3. 跨平台一致性降低,但功能正常
---
## 📝 当前状态
```
Google Fonts 集成: ████████░░ 95%
```
**剩余工作**:删除 10 处 const 关键字约5分钟
**预期完成时间**:今天
---
**文档版本**: 1.0
**最后更新**: 2025-11-22

View File

@@ -1,323 +0,0 @@
# 🎨 App Icon Design - Implementation Guide
**Date**: 2025-11-22
**Status**: Ready for implementation
---
## ✅ What's Been Prepared
I've created a complete app icon design system for FocusBuddy with:
1. **3 Design Options** - Visual previews in your browser
2. **Complete Documentation** - Technical specifications and guidelines
3. **Step-by-step Instructions** - Easy to follow guide
---
## 📂 Files Created
### 1. [icon-preview.html](icon-preview.html)
**Open this in your browser** to see:
- 3 different icon design options
- Size previews (180×180, 120×120, 48×48)
- App color palette
- Instructions for creating the icon
### 2. [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md)
Complete technical documentation including:
- Design specifications
- Color codes
- Size requirements (iOS & Android)
- Tool recommendations
- Installation instructions
- Design checklist
---
## 🎨 Three Design Options
### Design 1: Gentle Focus Buddy ⭐ Recommended
- Friendly face with gentle smile
- Concentric circles (focus rings)
- Most approachable and "buddy-like"
- **Best for**: Apps emphasizing support and encouragement
### Design 2: Pure Focus
- Minimalist concentric circles
- No face, pure geometry
- Meditative and calming
- **Best for**: Apps emphasizing mindfulness and zen
### Design 3: Focus Timer
- Classic timer/clock design
- Hands pointing to 25 minutes (Pomodoro)
- Clear function indicator
- **Best for**: Apps emphasizing productivity
---
## 🚀 Quick Start (30 minutes total)
### Step 1: Choose Design (2 minutes)
1. Open `icon-preview.html` in your browser
2. Look at all three designs
3. Pick your favorite
### Step 2: Create Icon (15 minutes)
**Option A: Use Figma (Recommended)**
```
1. Go to figma.com (create free account)
2. Press 'F' to create frame
3. Size: 1024×1024
4. Recreate your chosen design using:
- Circle tool (O key)
- Rectangle tool (R key)
- Colors from the preview
5. Export as PNG (1024×1024)
```
**Option B: Use Canva**
```
1. Go to canva.com
2. Custom size: 1024×1024
3. Use shapes to recreate design
4. Download as PNG
```
### Step 3: Generate All Sizes (5 minutes)
```
1. Go to appicon.co
2. Upload your 1024×1024 PNG
3. Select iOS and Android
4. Download the generated zip
5. Unzip to get all icon sizes
```
### Step 4: Install in Project (8 minutes)
**iOS:**
```bash
# Copy files to:
ios/Runner/Assets.xcassets/AppIcon.appiconset/
# Replace all existing icon files
```
**Android:**
```bash
# Copy files to these folders:
android/app/src/main/res/mipmap-mdpi/ic_launcher.png
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
```
### Step 5: Test
```bash
flutter clean
flutter run -d edge # See icon in browser tab
# Or test on Android/iOS device
```
---
## 🎨 App Colors (Copy-Paste Ready)
Use these exact colors when creating the icon:
```
Primary Green: #A7C4BC
Success Green: #88C9A1
Background: #F8F6F2
Text Gray: #5B6D6D
```
**For gradients:**
```
Top: #A7C4BC
Bottom: #88C9A1
```
---
## 💡 Design Tips
### Do's ✅
- Keep it simple and recognizable
- Use the app's exact color codes
- Test at small size (48×48)
- Make it friendly and approachable
- Use rounded shapes (circles, soft corners)
### Don'ts ❌
- Don't use text (unreadable at small sizes)
- Don't use complex details
- Don't use thin lines (< 10px at 1024×1024)
- Don't use dark or aggressive colors
- Don't copy other apps
---
## 🔧 Recommended Tools
### For Design
1. **Figma** - https://www.figma.com
- Free, professional, easy to use
- Best for precise control
- ⭐ Recommended
2. **Canva** - https://www.canva.com
- Free, very beginner-friendly
- Good for quick designs
- Has templates
### For Size Generation
1. **AppIcon.co** - https://appicon.co
- Upload 1024×1024, get all sizes
- Free, works perfectly
- ⭐ Highly recommended
2. **IconKitchen** - https://icon.kitchen
- Good for Android adaptive icons
- More complex, more control
---
## 📋 Checklist
### Design Phase
- [ ] Open icon-preview.html in browser
- [ ] Choose your favorite design (1, 2, or 3)
- [ ] Create 1024×1024 master icon in Figma/Canva
- [ ] Use exact color codes from above
- [ ] Test visibility at small size
### Export Phase
- [ ] Export master as PNG (1024×1024)
- [ ] Upload to appicon.co
- [ ] Generate all iOS and Android sizes
- [ ] Download and unzip files
### Installation Phase
- [ ] Copy files to iOS folder
- [ ] Copy files to Android folders
- [ ] Run `flutter clean`
- [ ] Test app launch
### Verification Phase
- [ ] Icon shows in browser tab (web)
- [ ] Icon shows on device home screen
- [ ] Icon looks good at small size
- [ ] Icon matches app aesthetic
---
## 📊 Technical Requirements
### iOS Sizes Needed
```
1024×1024 - App Store
180×180 - iPhone @3x
120×120 - iPhone @2x
167×167 - iPad Pro
152×152 - iPad @2x
76×76 - iPad @1x
```
### Android Sizes Needed
```
192×192 - xxxhdpi (4x)
144×144 - xxhdpi (3x)
96×96 - xhdpi (2x)
72×72 - hdpi (1.5x)
48×48 - mdpi (1x)
512×512 - Play Store listing
```
---
## 🎯 My Recommendation
**Use Design 1: "Gentle Focus Buddy"**
**Why?**
1. ✅ Most aligned with app's "buddy" concept
2. ✅ Friendly and non-intimidating
3. ✅ Stands out among productivity apps
4. ✅ Instantly recognizable at small sizes
5. ✅ Appeals to ADHD and neurodiverse users
**This design embodies your app's core value**: A supportive companion, not a strict taskmaster.
---
## 🚨 Common Issues & Solutions
### Issue: Icon looks blurry on iOS
**Solution**: Make sure you exported at exactly 1024×1024, not scaled
### Issue: Android icon has white background
**Solution**: Use PNG with transparency, or fill background with gradient
### Issue: Icon too complex at small size
**Solution**: Simplify - remove small details, use thicker lines
### Issue: Colors don't match app
**Solution**: Double-check you're using exact hex codes (#A7C4BC, etc.)
---
## 📱 Next Steps After Icon
Once your icon is installed:
1. **Test on devices** - See it on home screen
2. **Prepare screenshots** - App store needs 6 screenshots
3. **Write app description** - Using product-design.md
4. **Submit to stores** - Follow mvp-launch-checklist.md
---
## 💬 Need Help?
If you get stuck:
1. **Check APP_ICON_DESIGN.md** - Full technical documentation
2. **Review icon-preview.html** - Visual reference
3. **Watch Figma tutorials** - YouTube: "How to design app icon in Figma"
4. **Use templates** - Canva has "app icon" templates
---
## ⏱️ Time Estimate
```
Design creation: 15-20 minutes
Size generation: 5 minutes
Installation: 10 minutes
Testing: 5 minutes
Total: 35-40 minutes
```
**You can complete this in less than an hour!**
---
## 🎉 Final Note
The icon is the first thing users see. It should make them feel:
- 😌 Calm and welcomed
- 🤝 Supported, not judged
- 🎯 Clear about the app's purpose
- 💚 Positive and encouraged
**Good luck with your design!** 🚀
---
**Status**: Ready to implement
**Next Step**: Open [icon-preview.html](icon-preview.html) and choose your design
**Documentation**: See [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md) for details

View File

@@ -1,66 +0,0 @@
# 🎨 App Icon - Quick Reference Card
## 📸 Preview
**Open this file**: [icon-preview.html](icon-preview.html)
## 🎯 Recommended Design
**Design 1: Gentle Focus Buddy** (with friendly face)
## 🎨 Colors to Use
```
#A7C4BC (Primary - calm green)
#88C9A1 (Success - bright green)
#F8F6F2 (Background - warm white)
#5B6D6D (Text - soft gray)
```
## ⚡ Quick Steps
### 1. Design (15 min)
1. Go to **figma.com**
2. Create **1024×1024** frame
3. Copy Design 1 from preview
4. Export as **PNG**
### 2. Generate (5 min)
1. Go to **appicon.co**
2. Upload your PNG
3. Select **iOS + Android**
4. Download zip
### 3. Install (10 min)
```bash
# Unzip downloaded file
# iOS: Copy to
ios/Runner/Assets.xcassets/AppIcon.appiconset/
# Android: Copy to
android/app/src/main/res/mipmap-*/ic_launcher.png
```
### 4. Test (2 min)
```bash
flutter clean
flutter run
```
## 📐 Master Size
**1024×1024 pixels** (PNG, no transparency for iOS)
## 🔧 Tools
- **Design**: Figma (figma.com) or Canva (canva.com)
- **Generate**: AppIcon.co (appicon.co)
## 📚 Full Docs
- **Preview**: [icon-preview.html](icon-preview.html)
- **Detailed Guide**: [ICON_IMPLEMENTATION_GUIDE.md](ICON_IMPLEMENTATION_GUIDE.md)
- **Technical Specs**: [APP_ICON_DESIGN.md](APP_ICON_DESIGN.md)
## ⏱️ Total Time
**30-40 minutes** from start to finish
---
**Status**: Ready to implement
**Next**: Open icon-preview.html and start designing! 🚀

View File

@@ -1,208 +0,0 @@
# ✅ 本地通知功能 - 实现完成
**完成时间**: 2025-11-22
**状态**: ✅ 代码实现完成,等待真机测试
---
## 🎉 实现成果
### 新增功能
- ✅ 计时完成时自动发送本地通知
- ✅ 显示专注时长和鼓励信息
- ✅ Android 权限配置完成
- ✅ iOS 权限请求完成
- ✅ Web 平台优雅降级(不报错)
### 代码变更
| 文件 | 状态 | 说明 |
|------|------|------|
| `lib/services/notification_service.dart` | 新增 | 200行完整的通知服务 |
| `lib/main.dart` | 修改 | 添加通知服务初始化 |
| `lib/screens/focus_screen.dart` | 修改 | 计时完成时调用通知 |
| `android/app/src/main/AndroidManifest.xml` | 修改 | 添加Android权限 |
| `NOTIFICATION_IMPLEMENTATION.md` | 新增 | 完整实现文档 |
---
## 🧪 测试状态
### Web 平台
-**已测试**: 应用成功启动
-**控制台输出**: "Notifications not supported on web platform"
-**无报错**: 优雅降级正常工作
-**功能正常**: 计时、保存、导航都正常
### Android 平台
-**待测试**: 需要 Android 设备或模拟器
- 📝 **测试要点**:
1. 首次权限对话框Android 13+
2. 前台通知
3. 后台通知
4. 通知内容准确性
### iOS 平台
-**待测试**: 需要 macOS + Xcode + iPhone
- 📝 **测试要点**:
1. 启动时权限对话框
2. 通知样式和内容
3. 后台通知
4. 通知点击行为
---
## 🎯 通知内容示例
### 场景 1: 无分心完成
```
标题: 🎉 Focus session complete!
内容: You focused for 25 minutes without distractions!
```
### 场景 2: 有分心完成
```
标题: 🎉 Focus session complete!
内容: You focused for 15 minutes. Great effort!
```
**设计理念**: 永远鼓励,符合"无惩罚"产品价值观 💚
---
## 📱 平台支持
| 平台 | 支持状态 | 说明 |
|------|---------|------|
| ✅ Android | 完全支持 | 需要 Android 13+ 权限 |
| ✅ iOS | 完全支持 | 需要用户授权 |
| ⚠️ Web | 优雅降级 | 不报错,但无通知 |
| ❓ Windows | 未测试 | 理论支持,需测试 |
| ❓ macOS | 未测试 | 理论支持,需测试 |
---
## 🚀 下一步行动
### 立即测试(推荐)
如果你有 Android 设备:
```bash
# 1. 连接手机并启用USB调试
# 2. 检查设备连接
flutter devices
# 3. 运行到 Android 设备
flutter run -d <device-id>
# 4. 测试流程
# - 开始1分钟专注
# - 等待完成
# - 查看是否收到通知
```
### 或者继续开发
如果现在没有测试设备,可以继续其他任务:
1. **设计应用图标** (1小时)
2. **准备应用截图** (1小时)
3. **填写应用商店描述** (30分钟)
稍后在真机测试时一并验证通知功能。
---
## 📊 MVP 完成度更新
```
█████████████████████ 98%
```
### 已完成
- ✅ 核心功能5个页面
- ✅ 数据持久化
- ✅ 历史记录
- ✅ 设置系统
- ✅ 本地通知 **← NEW!**
### 待完成2%
- ⏳ 应用图标设计
- ⏳ 应用商店截图
- ⏳ 真机测试
---
## 💡 技术亮点
### 1. 单例模式
```dart
class NotificationService {
static final NotificationService _instance = NotificationService._internal();
factory NotificationService() => _instance;
NotificationService._internal();
}
```
全局唯一实例,避免重复初始化。
### 2. 平台检测
```dart
if (kIsWeb) {
print('Notifications not supported on web platform');
return;
}
```
编译时常量,零性能开销。
### 3. 优雅错误处理
```dart
try {
await _notifications.show(...);
} catch (e) {
if (kDebugMode) {
print('Failed to show notification: $e');
}
// 静默失败,不影响用户体验
}
```
### 4. 异步安全导航
```dart
void _onTimerComplete() async {
await notificationService.showFocusCompletedNotification(...);
if (!mounted) return; // 检查 Widget 是否还在
Navigator.pushReplacement(...);
}
```
---
## 📖 相关文档
- [NOTIFICATION_IMPLEMENTATION.md](NOTIFICATION_IMPLEMENTATION.md) - 完整实现文档200行
- 架构设计
- 代码实现
- Android/iOS 配置
- 测试指南20+ 测试用例)
- 常见问题 FAQ
---
## 🎊 总结
**通知功能已100%实现完成!**
- ✅ 代码无错误
- ✅ Web 平台验证通过
- ✅ 文档完整详细
- ⏳ 等待 Android/iOS 真机测试
**预计测试时间**: 15分钟在 Android 设备上)
---
**准备好继续下一个任务了吗?** 🚀
选择方向:
1. **设计应用图标** - 上架必需1小时
2. **真机测试通知** - 如果有 Android 设备
3. **准备应用商店材料** - 截图+描述2小时
4. **其他改进** - 字体、UI优化等
告诉我你想做什么!

View File

@@ -1,157 +0,0 @@
# 🚀 FocusBuddy - 快速启动指南
## 📱 立即运行
### Windows 桌面版(推荐用于开发测试)
```bash
cd f:\cursor-auto\focusBuddy
flutter run -d windows
```
### Web 版(最快)
```bash
cd f:\cursor-auto\focusBuddy
flutter run -d edge
```
---
## ✅ 已完成的核心功能
### 可以体验的完整流程:
1. **启动 App** → 看到 FocusBuddy 首页
2. **点击 "Start Focusing"** → 进入计时页面
3. **观察倒计时** → 从 25:00 开始倒数
4. **点击 "I got distracted"** → 弹出分心类型选择
5. **选择分心原因** → 看到鼓励提示 "It happens. Let's gently come back."
6. **继续等待或点击 "Pause"** → 暂停/恢复计时
7. **完成或提前停止** → 进入完成页面
8. **查看今日统计** → 显示总时长和分心次数
9. **点击 "Start Another"** → 返回首页,开始新一轮
---
## 🎯 测试重点
### 1. 核心价值验证
- ✅ "I got distracted" 是否**不中断**计时?
- ✅ 鼓励文案是否足够**温柔**
- ✅ 提前停止是否有**友好提示**
### 2. 数据持久化
- ✅ 完成一次专注后,重启 app
- ✅ 再完成一次专注
- ✅ 查看完成页的 "Total Today" 是否累加?
### 3. UI/UX
- ✅ 按钮是否足够大?
- ✅ 文字是否清晰易读?
- ✅ 颜色是否柔和舒适?
---
## 🐛 预期问题
### 1. 字体显示
**现象**: 字体不是 Nunito而是系统默认字体
**原因**: 字体文件未下载
**影响**: 不影响功能,仅视觉效果
**解决**: 见 `FONT_SETUP.md`
### 2. History/Settings 按钮
**现象**: 点击显示 "coming soon"
**原因**: 这些页面还未实现
**影响**: 不影响核心流程
**解决**: 后续开发
---
## 📊 当前完成度
```
核心功能: ████████████████░░ 70%
MVP 总体: ████████████░░░░░░ 60%
```
**可以上线吗?** 还不能,需要补充:
- History 页面(显示历史记录)
- Settings 页面(时长选择)
- 本地通知(计时完成提醒)
- 字体配置
- 应用图标
**预计完成 MVP**: 本周末2-3天
---
## 🎨 已实现的设计细节
### 配色(莫兰迪色系)
- 主色: `#A7C4BC` (Calm Green)
- 背景: `#F8F6F2` (Warm Off-White)
- 文字: `#5B6D6D` (Dark Gray)
- 分心按钮: `#E0E0E0` (Light Gray)
### 交互
- ✅ 大按钮56px 高度)
- ✅ 圆角设计16px
- ✅ 底部弹窗(分心类型选择)
- ✅ Toast 提示(鼓励文案)
- ✅ 确认对话框(提前停止)
### 文案
- 15 条随机鼓励文案
- "It happens. Let's gently come back."
- "That's totally fine — you still focused for X minutes!"
---
## 💻 开发环境信息
```
Flutter: 3.38.0 (stable)
Dart: 3.10.0
Platform: Windows 10
IDE: VS Code / Cursor
```
### 已安装的包:
- ✅ hive: ^2.2.3
- ✅ hive_flutter: ^1.1.0
- ✅ flutter_local_notifications: ^17.0.0
- ✅ path_provider: ^2.1.0
- ✅ shared_preferences: ^2.2.0
---
## 📝 下一步开发任务
### 今天可以完成:
- [ ] 体验完整流程,记录问题
- [ ] 下载 Nunito 字体(或使用 google_fonts 包)
- [ ] 优化 UI 细节
### 明天任务:
- [ ] 实现 History Screen简单列表
- [ ] 实现 Settings Screen3个时长选项
### 后天任务:
- [ ] 添加本地通知
- [ ] 准备应用图标
- [ ] 真机测试
---
## 🎉 恭喜!
你已经完成了 **FocusBuddy 的核心功能**
现在运行 `flutter run -d windows` 看看效果吧!
---
**有问题?查看**:
- 📖 [README.md](README.md) - 项目总览
- 📋 [DEVELOPMENT_PROGRESS.md](DEVELOPMENT_PROGRESS.md) - 开发进度
- 📝 [mvp-launch-checklist.md](mvp-launch-checklist.md) - MVP 清单

View File

@@ -1,16 +0,0 @@
# Font Optimization - Quick Fix Script
# This script removes 'const' from Text widgets that use AppTextStyles
# because Google Fonts returns non-const TextStyle objects
cd f:\cursor-auto\focusBuddy\lib\screens
# Fix remaining files with sed-like pattern (pseudo code)
# const Text(...style: AppTextStyles...) -> Text(...style: AppTextStyles...)
# const Padding(...child: Text(...style: AppTextStyles...)) -> Padding(...child: Text(...style: AppTextStyles...))
echo "Manual fixes needed for:"
echo "- settings_screen.dart lines 63, 84, 100, 251, 276"
echo "- complete_screen.dart line 46"
echo ""
echo "Quick fix: Remove 'const' keyword before Text/Padding widgets that use AppTextStyles"

View File

@@ -6,7 +6,7 @@ packages:
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "67.0.0" version: "67.0.0"
analyzer: analyzer:
@@ -14,7 +14,7 @@ packages:
description: description:
name: analyzer name: analyzer
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "6.4.1" version: "6.4.1"
args: args:
@@ -22,7 +22,7 @@ packages:
description: description:
name: args name: args
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.7.0" version: "2.7.0"
async: async:
@@ -30,7 +30,7 @@ packages:
description: description:
name: async name: async
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.13.0" version: "2.13.0"
boolean_selector: boolean_selector:
@@ -38,7 +38,7 @@ packages:
description: description:
name: boolean_selector name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
build: build:
@@ -46,7 +46,7 @@ packages:
description: description:
name: build name: build
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.1" version: "2.4.1"
build_config: build_config:
@@ -54,7 +54,7 @@ packages:
description: description:
name: build_config name: build_config
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
build_daemon: build_daemon:
@@ -62,7 +62,7 @@ packages:
description: description:
name: build_daemon name: build_daemon
sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.1.1" version: "4.1.1"
build_resolvers: build_resolvers:
@@ -70,7 +70,7 @@ packages:
description: description:
name: build_resolvers name: build_resolvers
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.2" version: "2.4.2"
build_runner: build_runner:
@@ -78,7 +78,7 @@ packages:
description: description:
name: build_runner name: build_runner
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.13" version: "2.4.13"
build_runner_core: build_runner_core:
@@ -86,7 +86,7 @@ packages:
description: description:
name: build_runner_core name: build_runner_core
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "7.3.2" version: "7.3.2"
built_collection: built_collection:
@@ -94,7 +94,7 @@ packages:
description: description:
name: built_collection name: built_collection
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "5.1.1" version: "5.1.1"
built_value: built_value:
@@ -102,7 +102,7 @@ packages:
description: description:
name: built_value name: built_value
sha256: "426cf75afdb23aa74bd4e471704de3f9393f3c7b04c1e2d9c6f1073ae0b8b139" sha256: "426cf75afdb23aa74bd4e471704de3f9393f3c7b04c1e2d9c6f1073ae0b8b139"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "8.12.1" version: "8.12.1"
characters: characters:
@@ -110,7 +110,7 @@ packages:
description: description:
name: characters name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.4.0" version: "1.4.0"
checked_yaml: checked_yaml:
@@ -118,7 +118,7 @@ packages:
description: description:
name: checked_yaml name: checked_yaml
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
clock: clock:
@@ -126,7 +126,7 @@ packages:
description: description:
name: clock name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
code_builder: code_builder:
@@ -134,7 +134,7 @@ packages:
description: description:
name: code_builder name: code_builder
sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.11.0" version: "4.11.0"
collection: collection:
@@ -142,7 +142,7 @@ packages:
description: description:
name: collection name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.19.1" version: "1.19.1"
convert: convert:
@@ -150,7 +150,7 @@ packages:
description: description:
name: convert name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
crypto: crypto:
@@ -158,7 +158,7 @@ packages:
description: description:
name: crypto name: crypto
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.0.7" version: "3.0.7"
cupertino_icons: cupertino_icons:
@@ -166,7 +166,7 @@ packages:
description: description:
name: cupertino_icons name: cupertino_icons
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.8" version: "1.0.8"
dart_style: dart_style:
@@ -174,7 +174,7 @@ packages:
description: description:
name: dart_style name: dart_style
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.3.6" version: "2.3.6"
dbus: dbus:
@@ -182,7 +182,7 @@ packages:
description: description:
name: dbus name: dbus
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.7.11" version: "0.7.11"
fake_async: fake_async:
@@ -190,7 +190,7 @@ packages:
description: description:
name: fake_async name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.3.3" version: "1.3.3"
ffi: ffi:
@@ -198,7 +198,7 @@ packages:
description: description:
name: ffi name: ffi
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
file: file:
@@ -206,7 +206,7 @@ packages:
description: description:
name: file name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "7.0.1" version: "7.0.1"
fixnum: fixnum:
@@ -214,7 +214,7 @@ packages:
description: description:
name: fixnum name: fixnum
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.1" version: "1.1.1"
flutter: flutter:
@@ -227,7 +227,7 @@ packages:
description: description:
name: flutter_lints name: flutter_lints
sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "6.0.0" version: "6.0.0"
flutter_local_notifications: flutter_local_notifications:
@@ -235,7 +235,7 @@ packages:
description: description:
name: flutter_local_notifications name: flutter_local_notifications
sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35" sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "17.2.4" version: "17.2.4"
flutter_local_notifications_linux: flutter_local_notifications_linux:
@@ -243,7 +243,7 @@ packages:
description: description:
name: flutter_local_notifications_linux name: flutter_local_notifications_linux
sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.0.1" version: "4.0.1"
flutter_local_notifications_platform_interface: flutter_local_notifications_platform_interface:
@@ -251,7 +251,7 @@ packages:
description: description:
name: flutter_local_notifications_platform_interface name: flutter_local_notifications_platform_interface
sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "7.2.0" version: "7.2.0"
flutter_test: flutter_test:
@@ -269,7 +269,7 @@ packages:
description: description:
name: frontend_server_client name: frontend_server_client
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
glob: glob:
@@ -277,7 +277,7 @@ packages:
description: description:
name: glob name: glob
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.3" version: "2.1.3"
google_fonts: google_fonts:
@@ -285,7 +285,7 @@ packages:
description: description:
name: google_fonts name: google_fonts
sha256: "517b20870220c48752eafa0ba1a797a092fb22df0d89535fd9991e86ee2cdd9c" sha256: "517b20870220c48752eafa0ba1a797a092fb22df0d89535fd9991e86ee2cdd9c"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "6.3.2" version: "6.3.2"
graphs: graphs:
@@ -293,7 +293,7 @@ packages:
description: description:
name: graphs name: graphs
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.3.2" version: "2.3.2"
hive: hive:
@@ -301,7 +301,7 @@ packages:
description: description:
name: hive name: hive
sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.3" version: "2.2.3"
hive_flutter: hive_flutter:
@@ -309,7 +309,7 @@ packages:
description: description:
name: hive_flutter name: hive_flutter
sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
hive_generator: hive_generator:
@@ -317,7 +317,7 @@ packages:
description: description:
name: hive_generator name: hive_generator
sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4" sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
http: http:
@@ -325,7 +325,7 @@ packages:
description: description:
name: http name: http
sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.6.0" version: "1.6.0"
http_multi_server: http_multi_server:
@@ -333,7 +333,7 @@ packages:
description: description:
name: http_multi_server name: http_multi_server
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.2.2" version: "3.2.2"
http_parser: http_parser:
@@ -341,7 +341,7 @@ packages:
description: description:
name: http_parser name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.1.2" version: "4.1.2"
intl: intl:
@@ -349,7 +349,7 @@ packages:
description: description:
name: intl name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.19.0" version: "0.19.0"
io: io:
@@ -357,7 +357,7 @@ packages:
description: description:
name: io name: io
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.5" version: "1.0.5"
js: js:
@@ -365,7 +365,7 @@ packages:
description: description:
name: js name: js
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.7.2" version: "0.7.2"
json_annotation: json_annotation:
@@ -373,7 +373,7 @@ packages:
description: description:
name: json_annotation name: json_annotation
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "4.9.0" version: "4.9.0"
leak_tracker: leak_tracker:
@@ -381,7 +381,7 @@ packages:
description: description:
name: leak_tracker name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "11.0.2" version: "11.0.2"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
@@ -389,7 +389,7 @@ packages:
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.0.10" version: "3.0.10"
leak_tracker_testing: leak_tracker_testing:
@@ -397,7 +397,7 @@ packages:
description: description:
name: leak_tracker_testing name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.0.2" version: "3.0.2"
lints: lints:
@@ -405,7 +405,7 @@ packages:
description: description:
name: lints name: lints
sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "6.0.0" version: "6.0.0"
logging: logging:
@@ -413,7 +413,7 @@ packages:
description: description:
name: logging name: logging
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
matcher: matcher:
@@ -421,7 +421,7 @@ packages:
description: description:
name: matcher name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.12.17" version: "0.12.17"
material_color_utilities: material_color_utilities:
@@ -429,7 +429,7 @@ packages:
description: description:
name: material_color_utilities name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.11.1" version: "0.11.1"
meta: meta:
@@ -437,7 +437,7 @@ packages:
description: description:
name: meta name: meta
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.17.0" version: "1.17.0"
mime: mime:
@@ -445,7 +445,7 @@ packages:
description: description:
name: mime name: mime
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
objective_c: objective_c:
@@ -453,7 +453,7 @@ packages:
description: description:
name: objective_c name: objective_c
sha256: "1f81ed9e41909d44162d7ec8663b2c647c202317cc0b56d3d56f6a13146a0b64" sha256: "1f81ed9e41909d44162d7ec8663b2c647c202317cc0b56d3d56f6a13146a0b64"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "9.1.0" version: "9.1.0"
package_config: package_config:
@@ -461,7 +461,7 @@ packages:
description: description:
name: package_config name: package_config
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.0" version: "2.2.0"
path: path:
@@ -469,7 +469,7 @@ packages:
description: description:
name: path name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.9.1" version: "1.9.1"
path_provider: path_provider:
@@ -477,7 +477,7 @@ packages:
description: description:
name: path_provider name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.5" version: "2.1.5"
path_provider_android: path_provider_android:
@@ -485,7 +485,7 @@ packages:
description: description:
name: path_provider_android name: path_provider_android
sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.22" version: "2.2.22"
path_provider_foundation: path_provider_foundation:
@@ -493,7 +493,7 @@ packages:
description: description:
name: path_provider_foundation name: path_provider_foundation
sha256: "6192e477f34018ef1ea790c56fffc7302e3bc3efede9e798b934c252c8c105ba" sha256: "6192e477f34018ef1ea790c56fffc7302e3bc3efede9e798b934c252c8c105ba"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.5.0" version: "2.5.0"
path_provider_linux: path_provider_linux:
@@ -501,7 +501,7 @@ packages:
description: description:
name: path_provider_linux name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.1" version: "2.2.1"
path_provider_platform_interface: path_provider_platform_interface:
@@ -509,7 +509,7 @@ packages:
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
path_provider_windows: path_provider_windows:
@@ -517,7 +517,7 @@ packages:
description: description:
name: path_provider_windows name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.3.0" version: "2.3.0"
petitparser: petitparser:
@@ -525,7 +525,7 @@ packages:
description: description:
name: petitparser name: petitparser
sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "7.0.1" version: "7.0.1"
platform: platform:
@@ -533,7 +533,7 @@ packages:
description: description:
name: platform name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.1.6" version: "3.1.6"
plugin_platform_interface: plugin_platform_interface:
@@ -541,7 +541,7 @@ packages:
description: description:
name: plugin_platform_interface name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.8" version: "2.1.8"
pool: pool:
@@ -549,7 +549,7 @@ packages:
description: description:
name: pool name: pool
sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.5.2" version: "1.5.2"
pub_semver: pub_semver:
@@ -557,7 +557,7 @@ packages:
description: description:
name: pub_semver name: pub_semver
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.0" version: "2.2.0"
pubspec_parse: pubspec_parse:
@@ -565,7 +565,7 @@ packages:
description: description:
name: pubspec_parse name: pubspec_parse
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.5.0" version: "1.5.0"
shared_preferences: shared_preferences:
@@ -573,7 +573,7 @@ packages:
description: description:
name: shared_preferences name: shared_preferences
sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.5.3" version: "2.5.3"
shared_preferences_android: shared_preferences_android:
@@ -581,7 +581,7 @@ packages:
description: description:
name: shared_preferences_android name: shared_preferences_android
sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b" sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.17" version: "2.4.17"
shared_preferences_foundation: shared_preferences_foundation:
@@ -589,7 +589,7 @@ packages:
description: description:
name: shared_preferences_foundation name: shared_preferences_foundation
sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.5.6" version: "2.5.6"
shared_preferences_linux: shared_preferences_linux:
@@ -597,7 +597,7 @@ packages:
description: description:
name: shared_preferences_linux name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.1" version: "2.4.1"
shared_preferences_platform_interface: shared_preferences_platform_interface:
@@ -605,7 +605,7 @@ packages:
description: description:
name: shared_preferences_platform_interface name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.1" version: "2.4.1"
shared_preferences_web: shared_preferences_web:
@@ -613,7 +613,7 @@ packages:
description: description:
name: shared_preferences_web name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.3" version: "2.4.3"
shared_preferences_windows: shared_preferences_windows:
@@ -621,7 +621,7 @@ packages:
description: description:
name: shared_preferences_windows name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.4.1" version: "2.4.1"
shelf: shelf:
@@ -629,7 +629,7 @@ packages:
description: description:
name: shelf name: shelf
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.4.2" version: "1.4.2"
shelf_web_socket: shelf_web_socket:
@@ -637,7 +637,7 @@ packages:
description: description:
name: shelf_web_socket name: shelf_web_socket
sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
sky_engine: sky_engine:
@@ -650,7 +650,7 @@ packages:
description: description:
name: source_gen name: source_gen
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.5.0" version: "1.5.0"
source_helper: source_helper:
@@ -658,7 +658,7 @@ packages:
description: description:
name: source_helper name: source_helper
sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.3.5" version: "1.3.5"
source_span: source_span:
@@ -666,7 +666,7 @@ packages:
description: description:
name: source_span name: source_span
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.10.1" version: "1.10.1"
stack_trace: stack_trace:
@@ -674,7 +674,7 @@ packages:
description: description:
name: stack_trace name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.12.1" version: "1.12.1"
stream_channel: stream_channel:
@@ -682,7 +682,7 @@ packages:
description: description:
name: stream_channel name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
stream_transform: stream_transform:
@@ -690,7 +690,7 @@ packages:
description: description:
name: stream_transform name: stream_transform
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
string_scanner: string_scanner:
@@ -698,7 +698,7 @@ packages:
description: description:
name: string_scanner name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.4.1" version: "1.4.1"
term_glyph: term_glyph:
@@ -706,7 +706,7 @@ packages:
description: description:
name: term_glyph name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.2" version: "1.2.2"
test_api: test_api:
@@ -714,7 +714,7 @@ packages:
description: description:
name: test_api name: test_api
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.7.7" version: "0.7.7"
timezone: timezone:
@@ -722,7 +722,7 @@ packages:
description: description:
name: timezone name: timezone
sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.9.4" version: "0.9.4"
timing: timing:
@@ -730,7 +730,7 @@ packages:
description: description:
name: timing name: timing
sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
typed_data: typed_data:
@@ -738,7 +738,7 @@ packages:
description: description:
name: typed_data name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.4.0" version: "1.4.0"
vector_math: vector_math:
@@ -746,7 +746,7 @@ packages:
description: description:
name: vector_math name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.0" version: "2.2.0"
vm_service: vm_service:
@@ -754,7 +754,7 @@ packages:
description: description:
name: vm_service name: vm_service
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "15.0.2" version: "15.0.2"
watcher: watcher:
@@ -762,7 +762,7 @@ packages:
description: description:
name: watcher name: watcher
sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.4" version: "1.1.4"
web: web:
@@ -770,7 +770,7 @@ packages:
description: description:
name: web name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.1" version: "1.1.1"
web_socket: web_socket:
@@ -778,7 +778,7 @@ packages:
description: description:
name: web_socket name: web_socket
sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
web_socket_channel: web_socket_channel:
@@ -786,7 +786,7 @@ packages:
description: description:
name: web_socket_channel name: web_socket_channel
sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.0.3" version: "3.0.3"
xdg_directories: xdg_directories:
@@ -794,7 +794,7 @@ packages:
description: description:
name: xdg_directories name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
xml: xml:
@@ -802,7 +802,7 @@ packages:
description: description:
name: xml name: xml
sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "6.6.1" version: "6.6.1"
yaml: yaml:
@@ -810,7 +810,7 @@ packages:
description: description:
name: yaml name: yaml
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.dev" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "3.1.3" version: "3.1.3"
sdks: sdks:

View File

@@ -1,250 +0,0 @@
# Terms of Service - FocusBuddy
**Last Updated:** November 22, 2025
**Effective Date:** November 22, 2025
**Contact:** focusbuddy.support@gmail.com
---
## 1. Acceptance of Terms
By downloading, installing, or using FocusBuddy (the "App"), you agree to be bound by these Terms of Service ("Terms"). If you do not agree to these Terms, please do not use the App.
These Terms apply to all users of the App, regardless of location.
---
## 2. Description of Service
FocusBuddy is a **focus timer application** designed to help users track their focus sessions in a gentle, non-judgmental way.
**Key Features:**
- Focus session timer (default 25 minutes)
- Distraction tracking with optional categorization
- Daily statistics and simple achievements
- Encouragement messages
- 100% offline functionality
**What FocusBuddy is NOT:**
- FocusBuddy is **not a medical device**.
- It is **not intended to diagnose, treat, cure, or prevent** any medical condition, including ADHD, ADD, or anxiety.
- It does **not provide medical advice** or replace consultation with a healthcare professional.
---
## 3. User Eligibility
FocusBuddy is intended for users **aged 13 and above**.
- Users under 13: We do not knowingly collect data from children under 13. If you are under 13, please do not use this App.
- Users 13-17: Parental or guardian consent is recommended.
---
## 4. Privacy & Data
**Your data stays on your device.**
- We do **not collect** any personal information (name, email, location, etc.).
- We do **not upload** your focus session data to any server.
- We do **not use** analytics or tracking tools (e.g., Google Analytics, Firebase Analytics).
- All data is stored **locally on your device only**.
**Third-Party Services:**
- The App may display ads via **Google AdMob** (in future versions). AdMob may collect limited device information (e.g., device model, OS version, approximate IP address) to serve ads. See [Google's Privacy Policy](https://policies.google.com/privacy) for details.
- You can opt out of personalized ads via your device settings.
For full details, see our [Privacy Policy](privacy-policy.md).
---
## 5. User Conduct
You agree to use FocusBuddy only for its intended purpose — tracking focus sessions.
**Prohibited Uses:**
- Modifying, reverse-engineering, or decompiling the App
- Using the App for any illegal or unauthorized purpose
- Attempting to access or interfere with the App's code or infrastructure
- Removing or obscuring any copyright, trademark, or proprietary notices
---
## 6. Intellectual Property
**Ownership:**
- The App, including all code, design, text, graphics, and trademarks, is owned by [Your Name / Your Studio Name] (the "Developer").
- These Terms grant you a limited, non-exclusive, non-transferable license to use the App for personal, non-commercial purposes.
**Your Data:**
- You retain ownership of any data you create within the App (e.g., focus session logs).
- Since all data is stored locally, you are responsible for backing it up if desired.
---
## 7. Disclaimer of Warranties
**The App is provided "AS IS" and "AS AVAILABLE" without warranties of any kind.**
We do not guarantee that:
- The App will be error-free, uninterrupted, or secure
- The App will meet your specific requirements
- Any bugs or defects will be corrected
**No Medical Claims:**
- FocusBuddy is **not a substitute for professional medical advice, diagnosis, or treatment**.
- If you have concerns about ADHD, anxiety, or other conditions, consult a qualified healthcare provider.
---
## 8. Limitation of Liability
**To the fullest extent permitted by law:**
The Developer shall not be liable for any:
- Indirect, incidental, consequential, or punitive damages
- Loss of data, profits, or business opportunities
- Damages arising from your use or inability to use the App
**Maximum Liability:**
- In jurisdictions that do not allow the exclusion of certain liabilities, our liability is limited to the amount you paid for the App (i.e., $0 if you downloaded it for free).
---
## 9. In-App Purchases & Subscriptions
**(Applicable if/when added)**
If the App offers in-app purchases (e.g., "Remove Ads" for $2.99):
- All purchases are final and non-refundable, except as required by law.
- Refund requests should be made through the platform where you purchased (Apple App Store or Google Play Store).
- Purchases are tied to your device and cannot be transferred.
---
## 10. Ads & Third-Party Content
**(Applicable if/when added)**
If the App displays ads:
- We are not responsible for the content of third-party ads.
- Clicking on ads may redirect you to external websites or apps — we are not liable for their content or privacy practices.
- You can remove ads via an in-app purchase (when available).
---
## 11. Changes to the App
We reserve the right to:
- Modify, update, or discontinue any feature of the App at any time
- Add or remove functionality in future versions
- Discontinue the App entirely (with reasonable notice if feasible)
**Updates:**
- App updates may be required for continued use.
- New features may be subject to additional terms.
---
## 12. Changes to These Terms
We may update these Terms from time to time.
**How We Notify You:**
- The "Last Updated" date at the top will be revised.
- Major changes will be announced via an in-app notice (if technically feasible).
- Continued use of the App after changes means you accept the new Terms.
**Your Options:**
- If you do not agree to the updated Terms, stop using the App and uninstall it.
---
## 13. Termination
**Your Rights:**
- You may stop using the App at any time by uninstalling it.
**Our Rights:**
- We may terminate or restrict your access if you violate these Terms.
- We may discontinue the App at any time without liability.
**Effect of Termination:**
- Upon termination, you must stop using the App and delete it from your device.
- Any provisions that should survive (e.g., disclaimers, limitations of liability) will remain in effect.
---
## 14. Governing Law
These Terms are governed by the laws of **[Your Country/State]**, without regard to conflict-of-law principles.
**Dispute Resolution:**
- Any disputes will be resolved in the courts of **[Your Jurisdiction]**.
- If legally required, you may be entitled to resolve disputes through arbitration or small claims court.
*(Note: Update this section with your actual location — e.g., "California, USA" or "England, UK")*
---
## 15. Severability
If any provision of these Terms is found to be invalid or unenforceable, the remaining provisions will continue in full force and effect.
---
## 16. Entire Agreement
These Terms, together with our [Privacy Policy](privacy-policy.md), constitute the entire agreement between you and the Developer regarding the App.
---
## 17. No Waiver
Our failure to enforce any right or provision of these Terms does not constitute a waiver of that right or provision.
---
## 18. Contact Us
If you have questions about these Terms, please contact us:
**Email:** focusbuddy.support@gmail.com
**Developer:** [Your Name / Studio Name]
**Website:** [your-website-url] *(optional)*
---
## 19. Platform-Specific Terms
**iOS (Apple App Store):**
- These Terms are between you and the Developer, not Apple.
- Apple has no obligation to provide support for the App.
- In case of failure to conform to any warranty, you may notify Apple for a refund (if applicable), and Apple's liability is limited to the purchase price.
- Apple is not responsible for addressing any claims related to the App.
- You represent that you are not located in a country subject to U.S. embargo or designated as a "terrorist supporting" country, and you are not on any U.S. prohibited party list.
**Android (Google Play Store):**
- These Terms are between you and the Developer, not Google.
- Google has no obligation to provide support for the App.
- Google is not responsible for the App or its content.
---
## Summary (Plain English)
**What you're agreeing to:**
1. FocusBuddy is just a focus timer — not medical advice.
2. Your data stays on your device; we don't collect anything.
3. The app is provided "as is" — we're not liable if something breaks.
4. Don't misuse the app or try to hack it.
5. We can update the app or these terms anytime.
6. If you don't like it, just uninstall — no hard feelings!
**Questions?** Email focusbuddy.support@gmail.com
---
**Document Status:** ✅ Ready to publish
**Host this at:** [your-website-url]/terms or as a GitHub Pages link
**Required for:** App Store & Play Store submissions (must be publicly accessible)