Flutter 框架跨平台鸿蒙开发 - 人生角色卡应用
摘要: 人生角色卡是一款基于开源鸿蒙跨平台开发的创新应用,通过每日随机分配角色(如艺术家、哲学家等12种类型)帮助用户体验不同生活方式。应用采用Flutter框架开发,支持鸿蒙OS/Web平台,提供角色卡片展示、行为指南、专属任务和体验日记等功能。核心设计融合心理学理论(角色扮演、心流体验等),以温暖橙黄色调营造轻松氛围,鼓励用户打破常规、拓展认知。项目结构清晰,包含角色模型、任务系统和日记模块,
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图





1.1 应用简介
人生角色卡是一款创新的生活体验应用,旨在通过每日随机分配角色的方式,帮助用户跳出日常生活的固有模式,以全新的视角和身份体验生活。应用每天清晨为用户分配一个独特的角色身份,并提供该角色的行为指南、心态建议和专属任务,让用户在一天中完全沉浸在这个角色中,体验不同的人生可能性。
应用以温暖的橙黄色为主色调,营造轻松愉悦的探索氛围。内置12种精心设计的角色类型,涵盖艺术、科学、哲学、冒险等多个领域,每种角色都有独特的性格特征、行为准则和日常任务。通过角色扮演的方式,帮助用户打破思维定式,培养多元视角,丰富人生体验。
1.2 核心理念
人生如戏,每个人都在扮演着不同的角色。然而,我们往往被固有的身份和习惯所束缚,难以跳出舒适区去体验不同的生活方式。人生角色卡的设计理念基于以下心理学原则:
| 设计原则 | 理论基础 | 应用体现 |
|---|---|---|
| 角色扮演 | 心理学角色理论 | 通过角色扮演拓展自我认知 |
| 随机探索 | 创造力理论 | 随机性激发创新思维 |
| 沉浸体验 | 心流理论 | 全身心投入角色获得心流 |
| 行为改变 | 习惯养成理论 | 通过角色任务改变行为模式 |
1.3 核心功能
1.4 角色类型
应用内置12种精心设计的角色类型,每种角色都有独特的世界观和行为方式:
| 序号 | 角色名称 | 图标 | 主题色 | 核心特质 | 代表任务 |
|---|---|---|---|---|---|
| 1 | 艺术家 | 🎨 | #E91E63 | 创意、敏感、表达 | 创作、观察、感受美 |
| 2 | 哲学家 | 🤔 | #673AB7 | 思考、质疑、智慧 | 思考、对话、阅读 |
| 3 | 冒险家 | 🗺️ | #FF9800 | 勇敢、好奇、探索 | 探索、尝试、冒险 |
| 4 | 科学家 | 🔬 | #2196F3 | 理性、严谨、发现 | 实验、观察、记录 |
| 5 | 诗人 | 📝 | #9C27B0 | 浪漫、感性、文字 | 写诗、观察、感悟 |
| 6 | 厨师 | 👨🍳 | #4CAF50 | 创造、分享、味觉 | 烹饪、品尝、创新 |
| 7 | 摄影师 | 📷 | #00BCD4 | 观察、记录、美感 | 拍摄、构图、发现 |
| 8 | 音乐家 | 🎵 | #FF5722 | 节奏、情感、表达 | 演奏、聆听、创作 |
| 9 | 园丁 | 🌱 | #8BC34A | 耐心、培育、生命 | 种植、照料、观察 |
| 10 | 侦探 | 🕵️ | #607D8B | 观察、推理、真相 | 观察、分析、推理 |
| 11 | 梦想家 | 💭 | #FFC107 | 想象、愿景、创造 | 梦想、规划、想象 |
| 12 | 慈善家 | 💝 | #E91E63 | 关爱、分享、奉献 | 帮助、分享、关爱 |
1.5 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 动画控制 | AnimationController | - |
| 状态管理 | setState | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.6 项目结构
lib/
└── main_role_card.dart
├── RoleCardApp # 应用入口
├── RoleType # 角色类型枚举
├── Role # 角色数据模型
├── DailyRole # 每日角色模型
├── RoleTask # 角色任务模型
├── RoleCardHomePage # 主页面(底部导航)
├── _buildTodayPage # 今日角色页面
├── _buildGalleryPage # 角色图鉴页面
├── _buildDiaryPage # 体验日记页面
└── _buildSettingsPage # 设置页面
二、系统架构
2.1 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 角色分配流程
三、核心模块设计
3.1 数据模型设计
3.1.1 角色类型枚举 (RoleType)
enum RoleType {
artist('艺术家', '🎨', Color(0xFFE91E63),
'用色彩和线条诠释世界',
['创意', '敏感', '表达']),
philosopher('哲学家', '🤔', Color(0xFF673AB7),
'在思考中寻找生命的意义',
['思考', '质疑', '智慧']),
adventurer('冒险家', '🗺️', Color(0xFFFF9800),
'勇敢探索未知的领域',
['勇敢', '好奇', '探索']),
scientist('科学家', '🔬', Color(0xFF2196F3),
'用理性揭示世界的规律',
['理性', '严谨', '发现']),
poet('诗人', '📝', Color(0xFF9C27B0),
'用文字捕捉瞬间的永恒',
['浪漫', '感性', '文字']),
chef('厨师', '👨🍳', Color(0xFF4CAF50),
'用美食传递温暖与爱',
['创造', '分享', '味觉']);
final String label;
final String icon;
final Color color;
final String description;
final List<String> traits;
}
3.1.2 角色模型 (Role)
class Role {
final RoleType type; // 角色类型
final String name; // 角色名称
final String description; // 角色描述
final List<String> traits; // 性格特质
final List<String> guidelines; // 行为指南
final List<String> mindset; // 心态建议
final List<RoleTask> tasks; // 专属任务
final String dailyQuote; // 每日格言
}
3.1.3 每日角色模型 (DailyRole)
class DailyRole {
final String id; // 唯一标识
final Role role; // 角色信息
final DateTime assignedDate; // 分配日期
final List<RoleTask> completedTasks; // 已完成任务
final double completionRate; // 完成率
final String? diaryContent; // 体验日记
final bool isCompleted; // 是否完成
int get totalTasks => role.tasks.length;
int get completedCount => completedTasks.length;
}
3.1.4 角色任务模型 (RoleTask)
class RoleTask {
final String id; // 唯一标识
final String title; // 任务标题
final String description; // 任务描述
final bool completed; // 是否完成
final DateTime? completedAt; // 完成时间
final int difficulty; // 难度等级(1-5)
final int expReward; // 经验奖励
}
3.1.5 角色分布统计
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 今日角色页面结构
3.2.3 角色图鉴页面结构
3.3 角色分配算法
3.4 任务完成流程
四、UI设计规范
4.1 配色方案
应用采用温暖的橙黄色为主色调,营造轻松愉悦的探索氛围:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #FF9800 (Orange) | 导航、强调元素 |
| 渐变起始 | #FF9800 | 角色卡片渐变 |
| 渐变结束 | #FFB74D | 角色卡片渐变 |
| 艺术家 | #E91E63 | 粉红色 |
| 哲学家 | #673AB7 | 深紫色 |
| 冒险家 | #FF9800 | 橙色 |
| 科学家 | #2196F3 | 蓝色 |
| 诗人 | #9C27B0 | 紫色 |
| 厨师 | #4CAF50 | 绿色 |
4.2 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 角色名称 | 28px | Bold | #FFFFFF |
| 角色描述 | 14px | Regular | #FFFFFF |
| 任务标题 | 16px | SemiBold | #000000 |
| 任务描述 | 13px | Regular | #757575 |
| 行为指南 | 14px | Regular | #424242 |
| 每日格言 | 15px | Italic | #616161 |
4.3 组件规范
4.3.1 角色卡片
┌─────────────────────────────────────────────────┐
│ │
│ ┌─────────┐ │
│ │ 🎨 │ │
│ └─────────┘ │
│ │
│ 艺术家 │
│ │
│ 用色彩和线条诠释世界 │
│ │
│ ┌────┐ ┌────┐ ┌────┐ │
│ │创意│ │敏感│ │表达│ │
│ └────┘ └────┘ └────┘ │
│ │
│ "每一笔都是灵魂的舞蹈" │
│ │
└─────────────────────────────────────────────────┘
4.3.2 任务卡片
┌─────────────────────────────────────────────────┐
│ ┌────┐ 观察一朵花10分钟 ✓ │
│ │ 1 │ 仔细观察花的颜色、形状、纹理 │
│ └────┘ 难度: ★★ 经验: +20 │
└─────────────────────────────────────────────────┘
4.3.3 行为指南卡片
┌─────────────────────────────────────────────────┐
│ 📋 行为指南 │
│ │
│ • 用艺术家的眼光观察世界 │
│ • 关注色彩、形状、光影的变化 │
│ • 尝试用不同方式表达感受 │
│ • 保持对美的敏感和追求 │
│ │
└─────────────────────────────────────────────────┘
4.3.4 体验日记卡片
┌─────────────────────────────────────────────────┐
│ 📝 今日体验 │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ │ │
│ │ 记录你作为艺术家的体验... │ │
│ │ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 心情: 😊 😐 😔 😤 😢 │
│ │
│ [保存日记] │
│ │
└─────────────────────────────────────────────────┘
五、核心功能实现
5.1 角色分配算法
Role _assignDailyRole() {
final today = DateTime.now();
final dateKey = '${today.year}-${today.month}-${today.day}';
if (_assignedDates.containsKey(dateKey)) {
return _getRoleByType(_assignedDates[dateKey]!);
}
final random = Random();
final availableRoles = RoleType.values.toList();
Map<RoleType, double> weights = {};
for (var role in availableRoles) {
int experienceCount = _roleStats[role] ?? 0;
weights[role] = 1.0 / (1.0 + experienceCount * 0.5);
}
double totalWeight = weights.values.reduce((a, b) => a + b);
double randomValue = random.nextDouble() * totalWeight;
double cumulative = 0;
RoleType selectedRole = availableRoles.first;
for (var entry in weights.entries) {
cumulative += entry.value;
if (randomValue <= cumulative) {
selectedRole = entry.key;
break;
}
}
_assignedDates[dateKey] = selectedRole;
_roleStats[selectedRole] = (_roleStats[selectedRole] ?? 0) + 1;
return _getRoleByType(selectedRole);
}
5.2 角色数据生成
Role _getRoleByType(RoleType type) {
switch (type) {
case RoleType.artist:
return Role(
type: type,
name: '艺术家',
description: '用色彩和线条诠释世界',
traits: ['创意', '敏感', '表达'],
guidelines: [
'用艺术家的眼光观察世界',
'关注色彩、形状、光影的变化',
'尝试用不同方式表达感受',
'保持对美的敏感和追求',
],
mindset: [
'每个人都是艺术家',
'美无处不在,需要用心发现',
'创作是灵魂的对话',
],
tasks: _generateArtistTasks(),
dailyQuote: '每一笔都是灵魂的舞蹈',
);
case RoleType.philosopher:
return Role(
type: type,
name: '哲学家',
description: '在思考中寻找生命的意义',
traits: ['思考', '质疑', '智慧'],
guidelines: [
'保持好奇心和求知欲',
'对一切保持质疑和思考',
'寻找事物背后的本质',
'与他人进行深度对话',
],
mindset: [
'思考是灵魂的体操',
'问题比答案更重要',
'智慧源于不断的追问',
],
tasks: _generatePhilosopherTasks(),
dailyQuote: '未经审视的人生不值得过',
);
default:
return _getDefaultRole(type);
}
}
5.3 任务生成系统
List<RoleTask> _generateArtistTasks() {
final random = Random();
final allTasks = [
RoleTask(
id: 'artist_1',
title: '观察一朵花10分钟',
description: '仔细观察花的颜色、形状、纹理',
difficulty: 2,
expReward: 20,
),
RoleTask(
id: 'artist_2',
title: '画一幅简笔画',
description: '用简单的线条记录眼前的景象',
difficulty: 3,
expReward: 30,
),
RoleTask(
id: 'artist_3',
title: '拍一张有艺术感的照片',
description: '寻找独特的角度和光影',
difficulty: 2,
expReward: 25,
),
RoleTask(
id: 'artist_4',
title: '用文字描述一种颜色',
description: '不用颜色名称,描述一种颜色的感觉',
difficulty: 4,
expReward: 40,
),
RoleTask(
id: 'artist_5',
title: '创作一首小诗',
description: '用诗意的语言表达此刻的感受',
difficulty: 3,
expReward: 35,
),
];
allTasks.shuffle(random);
return allTasks.take(3).toList();
}
5.4 任务完成处理
void _completeTask(RoleTask task) {
setState(() {
final updatedTask = task.copyWith(
completed: true,
completedAt: DateTime.now(),
);
_todayRole!.completedTasks.add(updatedTask);
final completionRate = _todayRole!.completedTasks.length /
_todayRole!.role.tasks.length;
if (completionRate >= 1.0) {
_showCompletionDialog();
}
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('任务完成! +${task.expReward} 经验'),
backgroundColor: Colors.green,
behavior: SnackBarBehavior.floating,
),
);
}
5.5 体验日记保存
void _saveDiary(String content, int mood) {
if (_todayRole == null) return;
final diary = DiaryEntry(
id: DateTime.now().millisecondsSinceEpoch.toString(),
roleType: _todayRole!.role.type,
date: DateTime.now(),
content: content,
mood: mood,
);
setState(() {
_diaries.insert(0, diary);
_todayRole = _todayRole!.copyWith(
diaryContent: content,
isCompleted: true,
);
});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('日记已保存'),
backgroundColor: Colors.green,
),
);
}
六、交互设计
6.1 角色分配交互
6.2 任务完成流程
6.3 页面切换状态
七、角色设计详解
7.1 艺术家角色
角色定位: 用艺术的眼光重新审视世界,发现生活中的美
核心特质:
- 创意: 打破常规思维,用新颖的方式看待事物
- 敏感: 对色彩、形状、光影保持高度敏感
- 表达: 通过各种方式表达内心的感受
行为指南:
- 用艺术家的眼光观察世界
- 关注色彩、形状、光影的变化
- 尝试用不同方式表达感受
- 保持对美的敏感和追求
专属任务示例:
| 任务 | 描述 | 难度 | 经验 |
|---|---|---|---|
| 观察一朵花10分钟 | 仔细观察花的颜色、形状、纹理 | ★★ | 20 |
| 画一幅简笔画 | 用简单的线条记录眼前的景象 | ★★★ | 30 |
| 拍一张有艺术感的照片 | 寻找独特的角度和光影 | ★★ | 25 |
| 用文字描述一种颜色 | 不用颜色名称,描述一种颜色的感觉 | ★★★★ | 40 |
| 创作一首小诗 | 用诗意的语言表达此刻的感受 | ★★★ | 35 |
每日格言: “每一笔都是灵魂的舞蹈”
7.2 哲学家角色
角色定位: 在思考中寻找生命的意义,培养深度思考能力
核心特质:
- 思考: 对一切保持好奇心和思考
- 质疑: 不轻易接受表面现象
- 智慧: 通过思考获得洞察和理解
行为指南:
- 保持好奇心和求知欲
- 对一切保持质疑和思考
- 寻找事物背后的本质
- 与他人进行深度对话
专属任务示例:
| 任务 | 描述 | 难度 | 经验 |
|---|---|---|---|
| 思考一个哲学问题 | 选择一个哲学问题深入思考30分钟 | ★★★ | 35 |
| 与他人深度对话 | 就一个话题进行15分钟的深度交流 | ★★★ | 30 |
| 阅读一篇哲学文章 | 阅读并思考一篇哲学相关的文章 | ★★ | 25 |
| 写下三个疑问 | 记录今天遇到的三个值得思考的问题 | ★★ | 20 |
| 反思一个日常现象 | 分析一个日常现象背后的原因 | ★★★★ | 40 |
每日格言: “未经审视的人生不值得过”
7.3 冒险家角色
角色定位: 勇敢探索未知领域,突破舒适区
核心特质:
- 勇敢: 敢于尝试新事物和挑战
- 好奇: 对未知保持强烈的好奇心
- 探索: 主动寻找和发现新的可能性
行为指南:
- 勇敢尝试从未做过的事
- 保持对未知的好奇心
- 主动探索新的地方和领域
- 记录每一次冒险的经历
专属任务示例:
| 任务 | 描述 | 难度 | 经验 |
|---|---|---|---|
| 走一条从未走过的路 | 选择一条陌生的路线回家或上班 | ★★ | 25 |
| 尝试一种新食物 | 品尝从未吃过的食物 | ★★ | 20 |
| 与陌生人交谈 | 主动与一个陌生人开始对话 | ★★★ | 35 |
| 学习一项新技能 | 花30分钟学习一项全新的技能 | ★★★★ | 40 |
| 探索一个新地方 | 去一个从未去过的地方 | ★★★ | 30 |
每日格言: “生命不息,冒险不止”
八、扩展功能规划
8.1 后续版本规划
8.2 功能扩展建议
8.2.1 成就系统
成就解锁机制:
- 角色大师: 体验所有12种角色
- 任务达人: 累计完成100个任务
- 日记作家: 撰写30篇体验日记
- 连续打卡: 连续7天完成所有任务
8.2.2 社交功能
社交互动机制:
- 分享角色卡片到社交媒体
- 查看朋友的今日角色
- 角色匹配和互动
- 角色体验交流社区
8.2.3 角色定制
个性化定制:
- 创建自定义角色
- 设计专属任务
- 分享角色模板
- 角色皮肤和主题
九、注意事项
9.1 开发注意事项
-
角色分配: 使用加权随机算法,确保角色分配的公平性
-
任务生成: 每天生成3-5个任务,难度适中
-
数据持久化: 使用SharedPreferences存储用户数据
-
日期判断: 准确判断今日是否已分配角色
9.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 角色重复分配 | 日期判断错误 | 检查日期格式 |
| 任务不显示 | 任务列表为空 | 检查任务生成逻辑 |
| 日记保存失败 | 数据未持久化 | 检查SharedPreferences |
| 完成率计算错误 | 任务数量错误 | 检查任务列表长度 |
9.3 使用建议
🎭 人生角色卡使用小贴士 🎭
全身心投入角色,不要有顾虑
完成任务时享受过程,不追求完美
记录真实的体验和感受
保持开放心态,接纳不同的角色
十、运行说明
10.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
10.2 运行命令
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_role_card.dart --web-port 8130
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_role_card.dart
# 运行到Windows
flutter run -d windows -t lib/main_role_card.dart
# 代码分析
flutter analyze lib/main_role_card.dart
十一、总结
人生角色卡应用通过每日随机分配角色的创新方式,帮助用户跳出日常生活的固有模式,以全新的视角和身份体验生活。应用内置12种精心设计的角色类型,涵盖艺术、科学、哲学、冒险等多个领域,每种角色都有独特的性格特征、行为准则和专属任务。
核心功能涵盖角色分配、任务系统、体验日记三大模块。角色分配采用加权随机算法,确保公平性和多样性;任务系统为每种角色生成专属任务,引导用户深入体验角色;体验日记帮助用户记录和反思角色扮演的过程。
应用采用Material Design 3设计规范,以温暖的橙黄色为主色调,界面轻松愉悦。通过本应用,希望能够帮助用户打破思维定式,培养多元视角,丰富人生体验,让每一天都成为一次全新的冒险。
每一天,都是一次全新的角色扮演
更多推荐




所有评论(0)