Flutter 框架跨平台鸿蒙开发 - 每日一问应用
摘要: "每日一问"是一款哲学问答应用,每天推送一个无标准答案的哲学问题,涵盖存在、自由、道德等六大主题,鼓励用户深度思考并记录感悟。应用采用Flutter开发,支持鸿蒙OS/Web平台,包含问题展示、思考记录、历史回顾等功能。通过简洁的界面设计和分类问题库(如"如果宇宙终将毁灭,一切还有意义吗?"),帮助用户在快节奏生活中培养哲学思考习惯。技术栈包括Dar
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图




1.1 应用简介
每日一问是一款启发思考的哲学问答应用,核心理念是"每天一个哲学问题,没有标准答案"。应用每天为用户推送一个精心挑选的哲学问题,涵盖存在、自由、道德、意识、时间、意义六大主题,引导用户进行深度思考,记录思想轨迹。
在这个快节奏的时代,人们往往忙于琐事而忽略了思考的本质。每日一问应用通过简洁优雅的界面设计,每天提供一个引人深思的问题,没有标准答案,只有个人的思考与感悟。用户可以记录自己的思考过程,回顾过往的思想轨迹,在日积月累中构建属于自己的哲学体系。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 今日问题 | 展示每日哲学问题 | 日期驱动算法 |
| 思考记录 | 记录个人思考内容 | TextField输入 |
| 历史回顾 | 查看过往问题和思考 | 列表展示 |
| 问题收藏 | 收藏喜欢的问题 | 状态管理 |
| 思考统计 | 统计思考数据 | 数据聚合 |
| 问题分类 | 按主题分类展示 | Tab切换 |
1.3 哲学问题分类
| 序号 | 分类名称 | Emoji | 主题色 | 核心议题 |
|---|---|---|---|---|
| 1 | 存在 | 🌌 | #673AB7 | 存在的本质、生命的意义 |
| 2 | 自由 | 🕊️ | #2196F3 | 自由意志、选择与命运 |
| 3 | 道德 | ⚖️ | #4CAF50 | 伦理道德、善恶判断 |
| 4 | 意识 | 🧠 | #FF9800 | 意识本质、心灵哲学 |
| 5 | 时间 | ⏳ | #00BCD4 | 时间本质、过去未来 |
| 6 | 意义 | 💫 | #E91E63 | 人生意义、价值追求 |
1.4 问题示例库
┌─────────────────────────────────────────────────────────┐
│ 哲学问题示例库 │
├─────────────────────────────────────────────────────────┤
│ 🌌 存在 │
│ • 如果一棵树在森林中倒下,没有人听见,它发出声音了吗? │
│ • 我们如何证明自己不是在梦境中? │
│ • 存在先于本质,还是本质先于存在? │
│ │
│ 🕊️ 自由 │
│ • 人的行为是完全自由的,还是被因果决定的? │
│ • 如果能预知未来,自由意志还存在吗? │
│ • 自由是选择的能力,还是选择的结果? │
│ │
│ ⚖️ 道德 │
│ • 道德是客观存在的,还是人类创造的? │
│ • 如果没有上帝,一切都是允许的吗? │
│ • 善良的行为是否需要善良的动机? │
│ │
│ 🧠 意识 │
│ • 意识是物质的产物,还是独立的存在? │
│ • 人工智能可以拥有意识吗? │
│ • "我"是什么?意识的本质是什么? │
│ │
│ ⏳ 时间 │
│ • 时间是真实存在的,还是人类的幻觉? │
│ • 过去和未来是否存在? │
│ • 如果时间旅行可能,会产生什么悖论? │
│ │
│ 💫 意义 │
│ • 人生的意义是什么? │
│ • 意义是被发现的,还是被创造的? │
│ • 如果宇宙终将毁灭,一切还有意义吗? │
└─────────────────────────────────────────────────────────┘
1.5 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | setState | - |
| 动画控制 | AnimationController | - |
| 数据持久化 | SharedPreferences | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
二、项目结构
lib/
├── main_daily_question.dart # 应用主入口
│ ├── DailyQuestionApp # 根应用组件
│ ├── QuestionCategory # 问题分类枚举
│ ├── PhilosophyQuestion # 哲学问题模型
│ ├── UserThought # 用户思考模型
│ ├── DailyQuestionHomePage # 主页面
│ ├── TodayQuestionPage # 今日问题页
│ ├── HistoryPage # 历史回顾页
│ ├── StatsPage # 统计页面
│ └── QuestionCard # 问题卡片组件
三、数据模型
3.1 QuestionCategory 枚举
enum QuestionCategory {
existence('存在', '🌌', Color(0xFF673AB7)),
freedom('自由', '🕊️', Color(0xFF2196F3)),
morality('道德', '⚖️', Color(0xFF4CAF50)),
consciousness('意识', '🧠', Color(0xFFFF9800)),
time('时间', '⏳', Color(0xFF00BCD4)),
meaning('意义', '💫', Color(0xFFE91E63));
final String label;
final String emoji;
final Color color;
}
3.2 PhilosophyQuestion 模型
class PhilosophyQuestion {
final String id; // 问题唯一标识
final String content; // 问题内容
final QuestionCategory category; // 问题分类
final DateTime date; // 问题日期
final String? philosopher; // 相关哲学家
final String? background; // 问题背景
final List<String> hints; // 思考提示
bool isFavorite; // 是否收藏
}
3.3 UserThought 模型
class UserThought {
final String id; // 思考唯一标识
final String questionId; // 关联问题ID
final String content; // 思考内容
final DateTime createdAt; // 创建时间
final DateTime? updatedAt; // 更新时间
final int wordCount; // 字数统计
final List<String> tags; // 自定义标签
}
四、核心功能实现
4.1 每日问题生成算法
4.2 问题生成算法实现
PhilosophyQuestion getDailyQuestion() {
final today = DateTime.now();
final dayOfYear = today.difference(DateTime(today.year, 1, 1)).inDays;
final questionIndex = dayOfYear % _questionBank.length;
final question = _questionBank[questionIndex];
final savedThought = _getThoughtForQuestion(question.id);
if (savedThought != null) {
question.userThought = savedThought;
}
return question;
}
4.3 思考记录流程
4.4 思考记录实现
void saveThought(String questionId, String content) {
final thought = UserThought(
id: DateTime.now().millisecondsSinceEpoch.toString(),
questionId: questionId,
content: content,
createdAt: DateTime.now(),
wordCount: content.replaceAll(RegExp(r'\s'), '').length,
);
setState(() {
_thoughts.add(thought);
_currentQuestion?.userThought = thought;
});
_saveToLocalStorage(thought);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: const Text('思考已记录 ✨'),
backgroundColor: _currentQuestion?.category.color,
),
);
}
4.5 收藏功能实现
void toggleFavorite(PhilosophyQuestion question) {
setState(() {
question.isFavorite = !question.isFavorite;
});
if (question.isFavorite) {
_favorites.add(question.id);
} else {
_favorites.remove(question.id);
}
_saveFavorites();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
question.isFavorite ? '已收藏到思想宝库 💎' : '已取消收藏',
),
duration: const Duration(seconds: 1),
),
);
}
五、界面设计
5.1 主页面布局
┌─────────────────────────────────────┐
│ 💭 每日一问 📊 │
│ 每天一个哲学问题,引发思考 │
├─────────────────────────────────────┤
│ [ 今日问题 ] [ 历史回顾 ] │
├─────────────────────────────────────┤
│ │
│ ┌─────────────────────────────┐ │
│ │ 🌌 存在 │ │
│ │ │ │
│ │ 如果一棵树在森林中倒下, │ │
│ │ 没有人听见,它发出声音了吗? │ │
│ │ │ │
│ │ ───────────────────────── │ │
│ │ 💭 思考提示: │ │
│ │ • 声音的存在是否依赖观察者? │ │
│ │ • 客观存在与主观感知的关系? │ │
│ │ │ │
│ │ 📅 2024年1月15日 │ │
│ │ 🏛️ 贝克莱 │ │
│ │ │ │
│ │ [💭 我的思考] [⭐ 收藏] │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 📊 思考统计 │ │
│ │ ───────────────────────── │ │
│ │ 连续思考: 7天 │ │
│ │ 累计字数: 2,456字 │ │
│ │ 收藏问题: 12个 │ │
│ └─────────────────────────────┘ │
│ │
└─────────────────────────────────────┘
5.2 思考输入界面
┌─────────────────────────────────────┐
│ ──── │
│ │
│ 💭 记录你的思考 │
│ │
│ 问题: │
│ 如果一棵树在森林中倒下... │
│ │
│ ┌─────────────────────────────┐ │
│ │ │ │
│ │ 写下你的思考... │ │
│ │ │ │
│ │ 这个问题让我想到了... │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └─────────────────────────────┘ │
│ │
│ 字数: 0/500 │
│ │
│ 💡 提示: 没有标准答案,真实记录 │
│ 你的思考过程即可 │
│ │
│ ┌─────────────────────────────┐ │
│ │ 保存思考 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
5.3 历史回顾页面
┌─────────────────────────────────────┐
│ ← 历史回顾 │
├─────────────────────────────────────┤
│ [全部] [存在] [自由] [道德] ... │
├─────────────────────────────────────┤
│ │
│ ┌─────────────────────────────┐ │
│ │ 🌌 存在 ⭐ 已收藏 │ │
│ │ │ │
│ │ 如果一棵树在森林中倒下... │ │
│ │ │ │
│ │ 💭 我的思考: │ │
│ │ 我认为声音的存在确实需要... │ │
│ │ │ │
│ │ 📅 1月15日 📝 156字 │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 🕊️ 自由 │ │
│ │ │ │
│ │ 人的行为是完全自由的... │ │
│ │ │ │
│ │ 💭 我的思考: │ │
│ │ 自由意志是一个复杂的概念... │ │
│ │ │ │
│ │ 📅 1月14日 📝 234字 │ │
│ └─────────────────────────────┘ │
│ │
└─────────────────────────────────────┘
5.4 统计页面
┌─────────────────────────────────────┐
│ 📊 思考统计 │
├─────────────────────────────────────┤
│ │
│ ┌─────────────────────────────┐ │
│ │ 连续思考天数 │ │
│ │ 🔥 7 │ │
│ │ 天 │ │
│ └─────────────────────────────┘ │
│ │
│ ┌───────────┐ ┌───────────┐ │
│ │ 累计字数 │ │ 收藏问题 │ │
│ │ 2,456 │ │ 12 │ │
│ │ 字 │ │ 个 │ │
│ └───────────┘ └───────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 问题分类统计 │ │
│ │ ───────────────────────── │ │
│ │ 🌌 存在 ████████ 8 │ │
│ │ 🕊️ 自由 ██████ 6 │ │
│ │ ⚖️ 道德 █████ 5 │ │
│ │ 🧠 意识 ████ 4 │ │
│ │ ⏳ 时间 ███ 3 │ │
│ │ 💫 意义 ██ 2 │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 本月思考字数趋势 │ │
│ │ │ │
│ │ ╭─╮ │ │
│ │ ╭╯ ╰╮ ╭╮ │ │
│ │ ╭╯ ╰──╯╰──╮ │ │
│ │ ╭╯ ╰─ │ │
│ │ 1日 7日 14日 21日 28日 │ │
│ └─────────────────────────────┘ │
│ │
└─────────────────────────────────────┘
六、动画效果
6.1 问题卡片渐入动画
AnimationController _fadeController;
void initState() {
super.initState();
_fadeController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 800),
);
_fadeController.forward();
}
Widget buildQuestionCard() {
return FadeTransition(
opacity: _fadeController,
child: SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, 0.3),
end: Offset.zero,
).animate(CurvedAnimation(
parent: _fadeController,
curve: Curves.easeOut,
)),
child: QuestionCard(question: _currentQuestion),
),
);
}
6.2 分类切换动画
AnimatedContainer(
duration: const Duration(milliseconds: 300),
decoration: BoxDecoration(
color: isSelected ? category.color.withValues(alpha: 0.15) : Colors.transparent,
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: isSelected ? category.color : Colors.grey.shade300,
width: isSelected ? 2 : 1,
),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Row(
children: [
Text(category.emoji, style: const TextStyle(fontSize: 16)),
const SizedBox(width: 8),
Text(
category.label,
style: TextStyle(
color: isSelected ? category.color : Colors.grey.shade700,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal,
),
),
],
),
),
)
6.3 思考按钮脉冲动画
_pulseController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
)..repeat(reverse: true);
ScaleTransition(
scale: Tween<double>(begin: 1.0, end: 1.05).animate(
CurvedAnimation(parent: _pulseController, curve: Curves.easeInOut),
),
child: ElevatedButton.icon(
onPressed: _showThoughtDialog,
icon: const Icon(Icons.edit_note),
label: const Text('我的思考'),
style: ElevatedButton.styleFrom(
backgroundColor: question.category.color,
foregroundColor: Colors.white,
),
),
)
七、问题库设计
7.1 存在类问题
| 序号 | 问题内容 | 相关哲学家 | 背景说明 |
|---|---|---|---|
| 1 | 如果一棵树在森林中倒下,没有人听见,它发出声音了吗? | 贝克莱 | 主观唯心主义 |
| 2 | 我们如何证明自己不是在梦境中? | 笛卡尔 | 怀疑论 |
| 3 | 存在先于本质,还是本质先于存在? | 萨特 | 存在主义 |
| 4 | "我"是什么?意识的本质是什么? | 休谟 | 自我同一性 |
| 5 | 如果一切都是物质的,精神还存在吗? | 德里达 | 唯物主义vs唯心主义 |
7.2 自由类问题
| 序号 | 问题内容 | 相关哲学家 | 背景说明 |
|---|---|---|---|
| 1 | 人的行为是完全自由的,还是被因果决定的? | 斯宾诺莎 | 决定论 |
| 2 | 如果能预知未来,自由意志还存在吗? | 奥古斯丁 | 自由意志 |
| 3 | 自由是选择的能力,还是选择的结果? | 萨特 | 存在主义自由 |
| 4 | 社会规范是否限制了真正的自由? | 卢梭 | 社会契约 |
| 5 | 自由意味着什么都可以做吗? | 康德 | 道德律令 |
7.3 道德类问题
| 序号 | 问题内容 | 相关哲学家 | 背景说明 |
|---|---|---|---|
| 1 | 道德是客观存在的,还是人类创造的? | 康德 | 道德实在论 |
| 2 | 如果没有上帝,一切都是允许的吗? | 陀思妥耶夫斯基 | 道德基础 |
| 3 | 善良的行为是否需要善良的动机? | 康德 | 义务论 |
| 4 | 结果正义还是程序正义更重要? | 穆勒 | 功利主义 |
| 5 | 道德判断是理性的还是情感的? | 休谟 | 情感主义 |
7.4 意识类问题
| 序号 | 问题内容 | 相关哲学家 | 背景说明 |
|---|---|---|---|
| 1 | 意识是物质的产物,还是独立的存在? | 笛卡尔 | 心身问题 |
| 2 | 人工智能可以拥有意识吗? | 塞尔 | 中文房间 |
| 3 | 他人的意识如何证明存在? | 维特根斯坦 | 他心问题 |
| 4 | 意识是连续的还是离散的? | 詹姆斯 | 意识流 |
| 5 | 自我意识从何而来? | 黑格尔 | 自我意识 |
7.5 时间类问题
| 序号 | 问题内容 | 相关哲学家 | 背景说明 |
|---|---|---|---|
| 1 | 时间是真实存在的,还是人类的幻觉? | 康德 | 先验时间 |
| 2 | 过去和未来是否存在? | 奥古斯丁 | 时间本质 |
| 3 | 如果时间旅行可能,会产生什么悖论? | 罗素 | 时间悖论 |
| 4 | 时间是线性的还是循环的? | 尼采 | 永恒轮回 |
| 5 | "现在"有多长? | 胡塞尔 | 时间意识 |
7.6 意义类问题
| 序号 | 问题内容 | 相关哲学家 | 背景说明 |
|---|---|---|---|
| 1 | 人生的意义是什么? | 加缪 | 荒诞主义 |
| 2 | 意义是被发现的,还是被创造的? | 萨特 | 存在主义 |
| 3 | 如果宇宙终将毁灭,一切还有意义吗? | 尼采 | 虚无主义 |
| 4 | 幸福是人生的目的吗? | 亚里士多德 | 幸福论 |
| 5 | 工作的意义是什么? | 马克思 | 劳动异化 |
八、数据统计功能
8.1 统计指标
| 统计项 | 计算方式 | 展示形式 |
|---|---|---|
| 连续思考天数 | 连续有思考记录的天数 | 数字+火焰图标 |
| 累计字数 | 所有思考内容的总字数 | 数字统计 |
| 收藏问题数 | 收藏的问题总数 | 数字统计 |
| 分类分布 | 各分类问题思考数量 | 柱状图 |
| 月度趋势 | 每月思考字数变化 | 折线图 |
| 平均字数 | 思考内容的平均字数 | 数字统计 |
8.2 统计数据结构
class ThoughtStats {
final int consecutiveDays; // 连续天数
final int totalWords; // 总字数
final int favoriteCount; // 收藏数
final int totalThoughts; // 思考总数
final Map<QuestionCategory, int> categoryCount; // 分类统计
final List<DailyStats> monthlyTrend; // 月度趋势
}
class DailyStats {
final DateTime date;
final int wordCount;
final int thoughtCount;
}
8.3 统计计算实现
ThoughtStats calculateStats() {
int consecutiveDays = 0;
DateTime? lastDate;
final sortedThoughts = _thoughts.toList()
..sort((a, b) => b.createdAt.compareTo(a.createdAt));
for (final thought in sortedThoughts) {
final thoughtDate = DateTime(
thought.createdAt.year,
thought.createdAt.month,
thought.createdAt.day,
);
if (lastDate == null) {
consecutiveDays = 1;
lastDate = thoughtDate;
} else {
final diff = lastDate.difference(thoughtDate).inDays;
if (diff == 1) {
consecutiveDays++;
lastDate = thoughtDate;
} else {
break;
}
}
}
return ThoughtStats(
consecutiveDays: consecutiveDays,
totalWords: _thoughts.fold(0, (sum, t) => sum + t.wordCount),
favoriteCount: _favorites.length,
totalThoughts: _thoughts.length,
categoryCount: _calculateCategoryCount(),
monthlyTrend: _calculateMonthlyTrend(),
);
}
九、运行与调试
9.1 运行命令
# 运行到鸿蒙设备
flutter run -d harmony lib/main_daily_question.dart
# 运行到Web服务器
flutter run -d web-server -t lib/main_daily_question.dart --web-port 8118
# 运行到Windows
flutter run -d windows -t lib/main_daily_question.dart
# 代码分析
flutter analyze lib/main_daily_question.dart
9.2 功能测试清单
| 测试项 | 测试内容 | 预期结果 |
|---|---|---|
| 问题展示 | 每日问题显示 | 正确展示当天问题 |
| 思考记录 | 输入并保存思考 | 成功保存到本地 |
| 历史查看 | 查看过往问题 | 列表正确展示 |
| 分类筛选 | 按分类查看问题 | 正确筛选展示 |
| 收藏功能 | 收藏/取消收藏 | 状态正确更新 |
| 统计展示 | 查看统计数据 | 数据准确无误 |
| 日期切换 | 跨日使用应用 | 自动切换问题 |
十、扩展方向
10.1 社交功能
┌─────────────┐ 分享思考 ┌─────────────┐
│ 用户A │ ───────────────→ │ 用户B │
└─────────────┘ └─────────────┘
│ │
│ 查看他人思考 │
│ 点赞与评论 │
│ 关注与粉丝 │
↓ ↓
┌─────────────┐ ┌─────────────┐
│ 思想社区 │ │ 思想碰撞 │
└─────────────┘ └─────────────┘
10.2 功能扩展计划
| 版本 | 功能 | 描述 |
|---|---|---|
| v1.1 | 问题推荐 | 根据用户兴趣推荐问题 |
| v1.2 | 思想导图 | 可视化思考路径 |
| v1.3 | 哲学家介绍 | 相关哲学家生平 |
| v1.4 | 思考提醒 | 每日定时提醒 |
| v1.5 | 云端同步 | 多设备数据同步 |
10.3 数据可视化
十一、哲学思考引导
11.1 思考方法
💭 哲学思考的五个层次 💭
| 层次 | 名称 | 描述 | 示例问题 |
|---|---|---|---|
| 第一层 | 描述 | 现象是什么? | 这个问题在问什么? |
| 第二层 | 分析 | 原因是什么? | 为什么会有这个问题? |
| 第三层 | 评价 | 价值是什么? | 这个问题重要吗? |
| 第四层 | 综合 | 关联是什么? | 这与其他问题有何联系? |
| 第五层 | 创造 | 新见是什么? | 我有什么新的理解? |
11.2 思考提示模板
┌─────────────────────────────────────────────────────────┐
│ 思考提示模板 │
├─────────────────────────────────────────────────────────┤
│ │
│ 📌 问题重述 │
│ 用自己的话重新描述这个问题... │
│ │
│ 🔍 核心概念 │
│ 这个问题涉及哪些核心概念? │
│ │
│ 💭 我的观点 │
│ 我对这个问题的初步看法是... │
│ │
│ 🤔 反面思考 │
│ 如果持相反观点,理由是什么? │
│ │
│ 🔗 关联思考 │
│ 这让我想到了... │
│ │
│ 💡 新的疑问 │
│ 这引发了什么新的问题? │
│ │
└─────────────────────────────────────────────────────────┘
十二、总结
每日一问应用通过"每天一个哲学问题,没有标准答案"的核心理念,为用户提供了一个深度思考的平台。应用涵盖存在、自由、道德、意识、时间、意义六大哲学主题,每个主题都配有精心设计的问题库,引导用户进行多维度的哲学思考。
应用采用简洁优雅的界面设计,以紫色为主色调,营造深邃的思考氛围。今日问题页面通过渐入动画展示每日问题,配合思考提示引导用户深入思考。思考记录功能支持用户记录个人感悟,历史回顾功能让用户能够追溯思想轨迹,统计功能则帮助用户了解自己的思考习惯。
问题库设计参考了东西方哲学经典,每个问题都标注了相关哲学家和背景说明,帮助用户理解问题的哲学内涵。思考引导模板提供了系统化的思考方法,从描述、分析、评价、综合到创造五个层次,帮助用户建立完整的哲学思维框架。
应用采用Material Design 3设计规范,遵循Flutter最佳实践,代码结构清晰,易于维护和扩展。后续版本计划增加社交功能、思想导图、哲学家介绍等功能,为用户提供更丰富的哲学思考体验。
每天一个问题,开启思想之旅 ✨
更多推荐




所有评论(0)