开源鸿蒙跨平台Flutter开发:每日一句应用

欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

1.1 应用简介

每日一句是一款提供每日推送有哲理的话、励志名言或温馨句子的应用,帮助用户开启美好的一天。应用内置多种类型的句子,包括哲理名言、励志语句、温馨祝福等,用户可以根据自己的喜好选择句子类型,设置每日推送时间,还可以收藏喜欢的句子。

应用以温暖的蓝色为主色调,象征希望与正能量。涵盖每日推荐、句子分类、我的收藏、设置中心四大模块。用户可以浏览每日推荐的句子,查看不同分类的句子,收藏喜欢的句子,设置推送时间和类型。

1.2 核心功能

功能模块 功能描述 实现方式
每日推荐 每日推送一句名言 定时推送
句子分类 按类型分类句子 标签筛选
句子详情 查看句子详情 详情页面
句子收藏 收藏喜欢的句子 本地存储
推送设置 设置推送时间和类型 本地存储

1.3 句子类型定义

序号 类型名称 Emoji 描述
1 哲理名言 🤔 富有哲理的名言警句
2 励志语句 💪 激励人心的励志话语
3 温馨祝福 🌟 温暖人心的祝福语
4 爱情句子 ❤️ 关于爱情的经典语句
5 友情句子 🤝 关于友情的温馨句子
6 人生感悟 🌈 对人生的感悟和思考

1.4 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
本地存储 shared_preferences -
通知系统 flutter_local_notifications -
目标平台 鸿蒙OS / Web API 21+

1.5 项目结构

复制代码
lib/
└── main_daily_quote.dart
    ├── DailyQuoteApp         # 应用入口
    ├── Quote                # 句子模型
    ├── QuoteCategory        # 句子分类枚举
    ├── QuoteService         # 句子服务
    ├── NotificationService  # 通知服务
    ├── QuoteController      # 句子控制器
    ├── DailyQuoteHomePage   # 主页面
    ├── _buildHomePage       # 首页
    ├── _buildCategoryPage   # 分类页面
    ├── _buildCollectionPage # 收藏页面
    └── _buildSettingsPage   # 设置页面

二、系统架构

2.1 整体架构图

Data Layer
Business Layer
Presentation Layer
主页面

DailyQuoteHomePage
首页
分类页面
收藏页面
设置页面
每日推荐
句子详情
分享功能
分类列表
句子列表
收藏列表
取消收藏
推送设置
类型设置
句子控制器

QuoteController
句子服务

QuoteService
通知服务

NotificationService
数据管理

DataManager
Quote

句子模型
QuoteCategory

分类枚举
LocalStorage

本地存储

2.2 类图设计

uses
uses
uses
creates
uses
DailyQuoteApp
+Widget build()
Quote
+String id
+String content
+String author
+QuoteCategory category
+bool isFavorite
+DateTime createdAt
<<enumeration>>
QuoteCategory
+String label
+String emoji
+philosophy()
+inspiration()
+warmth()
+love()
+friendship()
+life()
QuoteService
+Future getDailyQuote()
+List getQuotesByCategory(QuoteCategory category)
+Quote getQuoteById(String id)
+void likeQuote(String id)
NotificationService
+Future initialize()
+Future scheduleDailyNotification(TimeOfDay time, QuoteCategory category)
+Future cancelNotification()
QuoteController
+List dailyQuotes
+List favoriteQuotes
+Future loadQuotes()
+Future getDailyQuote()
+void toggleFavorite(Quote quote)
+void setNotificationTime(TimeOfDay time)
+void setNotificationCategory(QuoteCategory category)
DailyQuoteHomePage
+Widget build()
+void _buildHomePage()
+void _buildCategoryPage()
+void _buildCollectionPage()
+void _buildSettingsPage()

2.3 页面导航流程

首页
分类
收藏
设置
应用启动
首页
底部导航
每日推荐
分类列表
收藏列表
设置中心
句子详情
分享句子
收藏句子
选择分类
句子列表
查看收藏
取消收藏
推送设置
类型设置
关于应用

2.4 每日推送流程

句子服务 通知服务 应用 用户 句子服务 通知服务 应用 用户 到达设定时间 设置推送时间和类型 调度每日通知 确认设置 获取每日句子 返回句子 发送通知 点击通知 显示句子详情


三、核心模块设计

3.1 数据模型设计

3.1.1 句子模型 (Quote)
dart 复制代码
class Quote {
  final String id;
  final String content;
  final String author;
  final QuoteCategory category;
  bool isFavorite;
  final DateTime createdAt;
  
  Quote({
    required this.id,
    required this.content,
    required this.author,
    required this.category,
    this.isFavorite = false,
    required this.createdAt,
  });
}
3.1.2 句子分类枚举 (QuoteCategory)
dart 复制代码
enum QuoteCategory {
  philosophy(label: '哲理名言', emoji: '🤔'),
  inspiration(label: '励志语句', emoji: '💪'),
  warmth(label: '温馨祝福', emoji: '🌟'),
  love(label: '爱情句子', emoji: '❤️'),
  friendship(label: '友情句子', emoji: '🤝'),
  life(label: '人生感悟', emoji: '🌈');

  final String label;
  final String emoji;

  const QuoteCategory({required this.label, required this.emoji});
}

3.2 页面结构设计

3.2.1 主页面布局

DailyQuoteHomePage
IndexedStack
首页
分类页面
收藏页面
设置页面
NavigationBar
首页 Tab
分类 Tab
收藏 Tab
设置 Tab

3.2.2 首页结构

首页
每日推荐
句子卡片
操作按钮
日期显示
句子内容
作者信息
卡片背景
句子文本
分类标签
分享按钮
收藏按钮
下一句按钮

3.2.3 分类页面结构

分类页面
分类标签
句子列表
哲理名言
励志语句
温馨祝福
爱情句子
友情句子
人生感悟
句子卡片
作者信息
收藏按钮

3.2.4 收藏页面结构

收藏页面
收藏列表
空状态
句子卡片
作者信息
分类标签
取消收藏
提示信息
引导按钮

3.3 句子获取逻辑





应用启动
加载句子数据
检查今日是否有推荐
显示今日推荐
生成今日推荐
根据设置的类型
随机选择句子
保存为今日推荐
显示今日推荐
用户操作
点击下一句
随机显示同类型句子
保持当前句子

3.4 推送设置逻辑

进入设置页面
推送设置
设置推送时间
设置推送类型
选择时间
保存设置
选择类型
调度通知
确认设置成功


四、UI设计规范

4.1 配色方案

应用以温暖的蓝色为主色调,象征希望与正能量:

颜色类型 色值 用途
主色 #1976D2 (Blue) 导航、主题元素
辅助色 #64B5F6 按钮、强调
第三色 #BBDEFB 背景、卡片
背景色 #F5F5F5 页面背景
卡片背景 #FFFFFF 信息卡片

4.2 分类色彩映射

分类 色值 视觉效果
哲理名言 #9C27B0 紫色
励志语句 #FF5722 橙色
温馨祝福 #4CAF50 绿色
爱情句子 #E91E63 粉色
友情句子 #2196F3 蓝色
人生感悟 #FFC107 黄色

4.3 字体规范

元素 字号 字重 颜色
页面标题 24px Bold 主色
句子内容 18px Regular #333333
作者信息 14px Light #666666
分类标签 12px Regular 对应分类色
按钮文本 16px Medium #FFFFFF

4.4 组件规范

4.4.1 句子卡片
复制代码
┌─────────────────────────────────────┐
│  "生活不是缺少美,而是缺少发现美的眼睛" │
│                                     │
│               --- 罗丹                 │
│                                     │
│  🤔 哲理名言                        │
│                                     │
│  [分享] [收藏] [下一句]              │
└─────────────────────────────────────┘
4.4.2 分类标签
复制代码
┌─────────────────────┐
│  🤔 哲理  💪 励志  🌟 温馨  ❤️ 爱情  🤝 友情  🌈 人生  │
└─────────────────────┘
4.4.3 设置页面
复制代码
┌─────────────────────────────────────┐
│  推送设置                            │
│  ─────────────────────────────────  │
│  ⏰ 推送时间: 08:00                  │
│  📱 推送类型: 哲理名言                │
│  📢 推送开关: ⚠️                     │
│                                     │
│  [保存设置]                         │
└─────────────────────────────────────┘

五、核心功能实现

5.1 句子服务实现

dart 复制代码
class QuoteService {
  final List<Quote> _quotes = [
    Quote(
      id: '1',
      content: '生活不是缺少美,而是缺少发现美的眼睛',
      author: '罗丹',
      category: QuoteCategory.philosophy,
      createdAt: DateTime.now(),
    ),
    Quote(
      id: '2',
      content: '成功不是终点,失败不是终结,只有勇气才是永恒',
      author: '丘吉尔',
      category: QuoteCategory.inspiration,
      createdAt: DateTime.now(),
    ),
    // 更多句子...
  ];

  Future<Quote> getDailyQuote() async {
    // 模拟获取每日句子
    await Future.delayed(Duration(seconds: 1));
    final random = Random();
    return _quotes[random.nextInt(_quotes.length)];
  }

  List<Quote> getQuotesByCategory(QuoteCategory category) {
    return _quotes.where((quote) => quote.category == category).toList();
  }

  Quote getQuoteById(String id) {
    return _quotes.firstWhere((quote) => quote.id == id);
  }

  void likeQuote(String id) {
    final quote = _quotes.firstWhere((q) => q.id == id);
    quote.isFavorite = !quote.isFavorite;
  }
}

5.2 通知服务实现

dart 复制代码
class NotificationService {
  late FlutterLocalNotificationsPlugin _notifications;

  Future<void> initialize() async {
    _notifications = FlutterLocalNotificationsPlugin();
    const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('app_icon');
    final InitializationSettings initializationSettings = InitializationSettings(
      android: initializationSettingsAndroid,
    );
    await _notifications.initialize(initializationSettings);
  }

  Future<void> scheduleDailyNotification(TimeOfDay time, QuoteCategory category) async {
    const AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails(
      'daily_quote_channel',
      '每日一句',
      importance: Importance.max,
      priority: Priority.high,
    );
    const NotificationDetails platformChannelSpecifics = NotificationDetails(
      android: androidPlatformChannelSpecifics,
    );

    await _notifications.zonedSchedule(
      0,
      '每日一句',
      '今天的励志名言已送达',
      _nextInstanceOfTime(time),
      platformChannelSpecifics,
      androidAllowWhileIdle: true,
      matchDateTimeComponents: DateTimeComponents.time,
    );
  }

  Future<void> cancelNotification() async {
    await _notifications.cancelAll();
  }

  TZDateTime _nextInstanceOfTime(TimeOfDay time) {
    final now = TZDateTime.now(DateTime.now().timeZoneName as dynamic);
    var scheduledDate = TZDateTime(
      DateTime.now().timeZoneName as dynamic,
      now.year,
      now.month,
      now.day,
      time.hour,
      time.minute,
    );
    if (scheduledDate.isBefore(now)) {
      scheduledDate = scheduledDate.add(const Duration(days: 1));
    }
    return scheduledDate;
  }
}

5.3 句子控制器实现

dart 复制代码
class QuoteController {
  final QuoteService _quoteService;
  final NotificationService _notificationService;
  final DataManager _dataManager;
  final List<Quote> dailyQuotes = [];
  final List<Quote> favoriteQuotes = [];
  TimeOfDay _notificationTime = TimeOfDay(hour: 8, minute: 0);
  QuoteCategory _notificationCategory = QuoteCategory.philosophy;

  QuoteController(this._quoteService, this._notificationService, this._dataManager);

  Future<void> initialize() async {
    await _notificationService.initialize();
    await loadQuotes();
    await loadSettings();
  }

  Future<void> loadQuotes() async {
    dailyQuotes.clear();
    final dailyQuote = await _quoteService.getDailyQuote();
    dailyQuotes.add(dailyQuote);
    
    favoriteQuotes.clear();
    final favorites = await _dataManager.loadFavoriteQuotes();
    favoriteQuotes.addAll(favorites);
  }

  Future<Quote> getDailyQuote() async {
    final quote = await _quoteService.getDailyQuote();
    dailyQuotes.insert(0, quote);
    if (dailyQuotes.length > 10) {
      dailyQuotes.removeRange(10, dailyQuotes.length);
    }
    return quote;
  }

  void toggleFavorite(Quote quote) {
    quote.isFavorite = !quote.isFavorite;
    if (quote.isFavorite) {
      favoriteQuotes.add(quote);
    } else {
      favoriteQuotes.removeWhere((q) => q.id == quote.id);
    }
    _dataManager.saveFavoriteQuotes(favoriteQuotes);
  }

  void setNotificationTime(TimeOfDay time) {
    _notificationTime = time;
    _dataManager.saveNotificationTime(time);
    _scheduleNotification();
  }

  void setNotificationCategory(QuoteCategory category) {
    _notificationCategory = category;
    _dataManager.saveNotificationCategory(category);
    _scheduleNotification();
  }

  Future<void> _scheduleNotification() async {
    await _notificationService.scheduleDailyNotification(_notificationTime, _notificationCategory);
  }

  Future<void> loadSettings() async {
    final time = await _dataManager.loadNotificationTime();
    if (time != null) {
      _notificationTime = time;
    }
    final category = await _dataManager.loadNotificationCategory();
    if (category != null) {
      _notificationCategory = category;
    }
  }
}

5.4 数据管理实现

dart 复制代码
class DataManager {
  static const String _favoriteQuotesKey = 'favorite_quotes';
  static const String _notificationTimeKey = 'notification_time';
  static const String _notificationCategoryKey = 'notification_category';

  // 模拟本地存储
  static Map<String, String> _storage = {};

  Future<List<Quote>> loadFavoriteQuotes() async {
    final jsonString = _storage[_favoriteQuotesKey];
    if (jsonString == null) return [];

    final jsonList = json.decode(jsonString) as List;
    return jsonList.map((json) => Quote.fromJson(json)).toList();
  }

  Future<void> saveFavoriteQuotes(List<Quote> quotes) async {
    final jsonList = quotes.map((quote) => quote.toJson()).toList();
    _storage[_favoriteQuotesKey] = json.encode(jsonList);
  }

  Future<TimeOfDay?> loadNotificationTime() async {
    final jsonString = _storage[_notificationTimeKey];
    if (jsonString == null) return null;

    final json = json.decode(jsonString);
    return TimeOfDay(hour: json['hour'], minute: json['minute']);
  }

  Future<void> saveNotificationTime(TimeOfDay time) async {
    final json = {'hour': time.hour, 'minute': time.minute};
    _storage[_notificationTimeKey] = json.encode(json);
  }

  Future<QuoteCategory?> loadNotificationCategory() async {
    final jsonString = _storage[_notificationCategoryKey];
    if (jsonString == null) return null;

    final categoryName = json.decode(jsonString);
    return QuoteCategory.values.firstWhere((c) => c.toString().split('.').last == categoryName);
  }

  Future<void> saveNotificationCategory(QuoteCategory category) async {
    _storage[_notificationCategoryKey] = json.encode(category.toString().split('.').last);
  }
}

六、交互设计

6.1 首页交互流程

句子控制器 首页 用户 句子控制器 首页 用户 打开应用 加载每日句子 返回今日推荐 显示句子 点击下一句 获取新句子 返回新句子 显示新句子 点击收藏 切换收藏状态 确认状态 更新UI 点击分享 显示分享选项

6.2 分类页面交互流程

进入分类页面
显示分类标签
选择分类
显示对应句子
点击句子
显示句子详情
收藏/分享

6.3 收藏页面交互流程

无收藏
有收藏
浏览句子
点击句子
返回
点击取消
更新列表
收藏页面
空状态
收藏列表
分类页面
句子详情
取消收藏


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 基础UI框架 每日推荐功能 句子分类功能 收藏功能 推送通知 分享功能 云端同步 自定义句子 社区互动 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 每日一句应用开发计划

7.2 功能扩展建议

7.2.1 云端同步

同步功能:

  • 支持账号登录
  • 云端备份收藏句子
  • 多设备同步
  • 数据恢复功能
7.2.2 自定义句子

自定义功能:

  • 添加个人句子
  • 编辑现有句子
  • 分类管理
  • 导出/导入
7.2.3 社区互动

社区功能:

  • 句子分享
  • 点赞评论
  • 热门句子
  • 贡献句子

八、注意事项

8.1 开发注意事项

  1. 通知权限:推送功能需要申请通知权限

  2. 数据存储:收藏句子需要本地存储

  3. 性能优化:句子加载需要优化

  4. 用户体验:界面需要简洁美观

  5. 兼容性:确保在不同设备上的显示效果一致

8.2 常见问题

问题 原因 解决方案
推送不生效 权限未开启 引导用户开启权限
收藏不保存 存储权限问题 检查存储权限
句子加载缓慢 网络连接问题 增加加载状态
应用崩溃 数据解析错误 增加异常处理
界面显示异常 设备兼容性 适配不同设备

8.3 使用技巧

📝 每日一句使用技巧 📝

每日推荐

  • 每天打开应用查看每日推荐
  • 点击下一句切换不同句子
  • 收藏喜欢的句子
  • 分享句子给朋友

分类浏览

  • 选择不同分类查看句子
  • 点击句子查看详情
  • 收藏喜欢的句子
  • 分享句子给朋友

收藏管理

  • 查看所有收藏的句子
  • 点击句子查看详情
  • 取消不需要的收藏
  • 分享收藏的句子

推送设置

  • 设置每日推送时间
  • 选择推送句子类型
  • 开启/关闭推送
  • 检查推送权限

九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+
Web浏览器 Chrome 90+

9.2 运行命令

bash 复制代码
# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_daily_quote.dart --web-port 8151

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_daily_quote.dart

# 代码分析
flutter analyze lib/main_daily_quote.dart

十、总结

每日一句应用通过每日推送有哲理的话、励志名言或温馨句子,帮助用户开启美好的一天。应用内置多种类型的句子,包括哲理名言、励志语句、温馨祝福等,用户可以根据自己的喜好选择句子类型,设置每日推送时间,还可以收藏喜欢的句子。

核心功能包括每日推荐、句子分类、句子收藏、推送设置等。应用采用温暖的蓝色为主色调,象征希望与正能量,界面简洁美观,交互流畅自然。

通过本应用,希望能够为用户提供每日的精神食粮,激励用户积极面对生活,发现生活中的美好,开启每一天的好心情。

每日一句------开启美好的一天


相关推荐
特立独行的猫a2 小时前
HarmonyOS 鸿蒙PC端 Qt 应用开发:第三方 Qt 开源软件移植指南
qt·harmonyos·鸿蒙·鸿蒙pc
提子拌饭1337 小时前
风息时钟:鸿蒙Flutter 实现的自然风格时钟应用
flutter·华为·架构·开源·harmonyos
浮芷.10 小时前
Flutter 框架跨平台鸿蒙开发 - AR动物互动应用
flutter·ar·harmonyos
迷藏49410 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
加农炮手Jinx12 小时前
Flutter 组件 conventional 适配鸿蒙 HarmonyOS 实战:约定式提交标准,构建自动化版本治理与 CI/CD 质量治理架构
flutter·harmonyos·鸿蒙·openharmony
王码码203512 小时前
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石
flutter·harmonyos·鸿蒙·openharmony
见山是山-见水是水12 小时前
Flutter 框架跨平台鸿蒙开发 - AR植物养护助手
flutter·华为·ar·harmonyos
GEO研究生12 小时前
深圳游戏主板品牌怎么选:2026年华硕、七彩虹、技嘉、微星产品线全解析
游戏
AI成长日志12 小时前
【GitHub开源项目专栏】AI推理优化框架深度解析(上):vLLM架构设计与核心实现
人工智能·开源·github