Flutter 框架跨平台鸿蒙开发 - 消费DNA
运行效果图消费DNA是一款独特的消费记录可视化应用,核心理念是"消费习惯像DNA双螺旋一样展示"。正如DNA承载着生命的遗传密码,我们的消费行为同样蕴含着独特的生活密码——每一次支出都是生活方式的基因表达,每一类消费都是个人价值观的显性特征。传统的记账软件往往以列表、图表等线性方式呈现消费数据,用户难以从中洞察消费模式的深层规律。消费DNA另辟蹊径,借鉴生物学中DNA双螺旋的经典结构,将消费记录转
消费DNA应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图



1.1 应用简介
消费DNA是一款独特的消费记录可视化应用,核心理念是"消费习惯像DNA双螺旋一样展示"。正如DNA承载着生命的遗传密码,我们的消费行为同样蕴含着独特的生活密码——每一次支出都是生活方式的基因表达,每一类消费都是个人价值观的显性特征。
传统的记账软件往往以列表、图表等线性方式呈现消费数据,用户难以从中洞察消费模式的深层规律。消费DNA另辟蹊径,借鉴生物学中DNA双螺旋的经典结构,将消费记录转化为旋转的螺旋节点,让用户在视觉上直观感受消费行为的"基因序列"。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| DNA可视化 | 双螺旋动态展示消费记录 | CustomPainter + AnimationController |
| 消费记录 | 添加、查看、管理消费明细 | StatefulWidget + ModalBottomSheet |
| 分类统计 | 按类别统计消费占比 | Map数据结构 + 百分比计算 |
| 月份筛选 | 按月份查看历史消费 | 水平滚动列表 + 状态切换 |
| 日期格式化 | 智能显示日期格式 | 时间差计算 + 条件判断 |
1.3 消费分类体系
| 序号 | 类别 | Emoji | 主题色 | 典型场景 |
|---|---|---|---|---|
| 1 | 餐饮 | 🍔 | #6B6B6B | 三餐、零食、饮品 |
| 2 | 交通 | 🚗 | #4CAF50 | 地铁、公交、打车 |
| 3 | 购物 | 🛍 | #E91E63 | 服饰、日用品、数码 |
| 4 | 娱乐 | 🎮 | #9C27B0 | 游戏、电影、演出 |
| 5 | 居住 | 🏠 | #795548 | 房租、水电、物业 |
| 6 | 通讯 | 📱 | #00BCD4 | 话费、网络、会员 |
| 7 | 教育 | 📚 | #3F51B5 | 书籍、课程、培训 |
| 8 | 医疗 | 💊 | #F44336 | 就诊、药品、保健 |
| 9 | 投资 | 💰 | #FF9800 | 理财、股票、基金 |
| 10 | 其他 | 📦 | #607D8B | 杂项支出 |
1.4 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | setState | - |
| 动画控制 | AnimationController | - |
| 自定义绘制 | CustomPainter | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
二、项目结构
lib/
├── main_consumption_dna.dart # 应用主入口
│ ├── ConsumptionDNAApp # 根应用组件
│ ├── ConsumptionCategory # 消费类别枚举
│ ├── ConsumptionRecord # 消费记录模型
│ ├── DNADoubleHelixPainter # DNA双螺旋绘制器
│ └── ConsumptionDNAHomePage # 主页面
三、数据模型
3.1 ConsumptionCategory 枚举
enum ConsumptionCategory {
food('餐饮', '🍔', Color(0xFF6B6B6B)),
transport('交通', '🚗', Color(0xFF4CAF50)),
shopping('购物', '🛍', Color(0xFFE91E63)),
entertainment('娱乐', '🎮', Color(0xFF9C27B0)),
housing('居住', '🏠', Color(0xFF795548)),
communication('通讯', '📱', Color(0xFF00BCD4)),
education('教育', '📚', Color(0xFF3F51B5)),
healthcare('医疗', '💊', Color(0xFFF44336)),
investment('投资', '💰', Color(0xFFFF9800)),
other('其他', '📦', Color(0xFF607D8B));
final String label;
final String emoji;
final Color color;
}
3.2 ConsumptionRecord 模型
class ConsumptionRecord {
final String id; // 记录唯一标识
final ConsumptionCategory category; // 消费类别
final double amount; // 消费金额
final String description; // 消费描述
final DateTime date; // 消费日期
final String? notes; // 备注信息
}
四、核心功能实现
4.1 DNA双螺旋绘制原理
4.2 螺旋曲线绘制
螺旋曲线基于三角函数参数方程实现:
{x=r⋅cos(θ)y=r⋅sin(θ) \begin{cases} x = r \cdot \cos(\theta) \\ y = r \cdot \sin(\theta) \end{cases} {x=r⋅cos(θ)y=r⋅sin(θ)
void _drawHelix(Canvas canvas, Offset center, double radius, double rotation, bool isLeft) {
final path = Path();
final direction = isLeft ? -1 : 1;
for (var i = 0; i < 360; i++) {
final angle = (i * 2 + rotation * direction) * pi / 180;
final x = center.dx + radius * cos(angle);
final y = center.dy + radius * sin(angle);
if (i == 0) {
path.moveTo(x, y);
} else {
path.lineTo(x, y);
}
}
final paint = Paint()
..color = isLeft ? Colors.blue.shade200 : Colors.red.shade200
..strokeWidth = 3
..style = PaintingStyle.stroke;
canvas.drawPath(path, paint);
}
4.3 消费节点绘制
void _drawNodes(Canvas canvas, Offset center, double radius, double rotation) {
for (var i = 0; i < records.length; i++) {
final record = records[i];
final angle = (i * 30 + rotation) * pi / 180;
final x = center.dx + radius * 0.8 * cos(angle);
final y = center.dy + radius * 0.8 * sin(angle);
canvas.drawCircle(Offset(x, y), 10, Paint()..color = record.category.color);
final textPainter = TextPainter(
text: TextSpan(
text: record.category.emoji,
style: const TextStyle(color: Colors.white, fontSize: 12),
),
textAlign: TextAlign.center,
);
textPainter.layout();
textPainter.paint(canvas, Offset(x - 6, y - 6));
}
}
4.4 统计计算逻辑
Widget _buildStatistics() {
final totalAmount = _records.fold(0.0, (sum, r) => sum + r.amount);
final categoryStats = <ConsumptionCategory, double>{};
for (final record in _records) {
categoryStats[record.category] =
(categoryStats[record.category] ?? 0) + record.amount;
}
final percentage = totalAmount > 0
? (amount / totalAmount * 100)
: 0;
}
4.5 日期格式化
String _formatDate(DateTime date) {
final now = DateTime.now();
final diff = now.difference(date);
if (diff.inDays == 0) {
return '今天';
} else if (diff.inDays == 1) {
return '昨天';
} else if (diff.inDays < 7) {
return '${diff.inDays}天前';
} else {
return '${date.month}月${date.day}日';
}
}
4.6 添加消费记录流程
五、界面设计
5.1 主页面布局
┌─────────────────────────────────────┐
│ 🧬 消费DNA │
│ 消费习惯像DNA双螺旋一样展示 │
├─────────────────────────────────────┤
│ [1月][2月][3月]...[12月] │
├─────────────────────────────────────┤
│ │
│ DNA双螺旋可视化 │
│ (动态旋转) │
│ │
├─────────────────────────────────────┤
│ 本月统计 总计: ¥180.00 │
│ ┌─────┐┌─────┐┌─────┐┌─────┐ │
│ │ 🍔 ││ 🚗 ││ 🛍 ││ 🎮 │ │
│ │13.9%││ 2.8%││83.3%││ 0.0%│ │
│ └─────┘└─────┘└─────┘└─────┘ │
├─────────────────────────────────────┤
│ 消费记录 3条记录│
│ ┌─────────────────────────────┐ │
│ │ 🍔 午餐 ¥25.00 │ │
│ │ 餐饮 │ │
│ │ 昨天 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 🚗 地铁 ¥5.00 │ │
│ │ 交通 │ │
│ │ 2天前 │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ 🛍 购物 ¥150.00 │ │
│ │ 购物 │ │
│ │ 3天前 │ │
│ └─────────────────────────────┘ │
│ │
│ [记录消费] │
└─────────────────────────────────────┘
5.2 添加消费记录弹窗
┌─────────────────────────────────────┐
│ ──── │
│ │
│ ➕ 记录消费 │
│ │
│ 消费类型 │
│ [🍔餐饮] [🚗交通] [🛍购物] │
│ [🎮娱乐] [🏠居住] [📱通讯] │
│ [📚教育] [💊医疗] [💰投资] │
│ [📦其他] │
│ │
│ 消费金额 │
│ ┌─────────────────────────────┐ │
│ │ ¥ 0.00 │ │
│ └─────────────────────────────┘ │
│ │
│ 消费描述 │
│ ┌─────────────────────────────┐ │
│ │ 例如:午餐、地铁、购物 │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 记录消费 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
5.3 月份选择器
┌─────────────────────────────────────┐
│ [1月] [2月] [3月] [4月] [5月] [6月] │
│ [7月] [8月] [9月] [10月][11月][12月]│
└─────────────────────────────────────┘
↑选中月份高亮显示
六、动画效果
6.1 DNA旋转动画
_rotationController = AnimationController(
vsync: this,
duration: const Duration(seconds: 10),
)..repeat();
AnimatedBuilder(
animation: _rotationController,
builder: (context, child) {
return CustomPaint(
painter: DNADoubleHelixPainter(
records: _records,
rotation: _rotationController.value * 2 * pi,
),
);
},
)
6.2 图标脉冲动画
_pulseController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
)..repeat(reverse: true);
AnimatedBuilder(
animation: _pulseController,
builder: (context, child) {
return Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.cyan.withValues(
alpha: 0.3 + (_pulseController.value * 0.2)
),
blurRadius: 10 + (_pulseController.value * 5),
),
],
),
);
},
)
七、运行与调试
7.1 运行命令
# 运行到鸿蒙设备
flutter run -d harmony lib/main_consumption_dna.dart
# 运行到Web服务器
flutter run -d web-server -t lib/main_consumption_dna.dart --web-port 8125
# 运行到Windows
flutter run -d windows -t lib/main_consumption_dna.dart
# 代码分析
flutter analyze lib/main_consumption_dna.dart
7.2 功能测试清单
| 测试项 | 测试内容 | 预期结果 |
|---|---|---|
| DNA可视化 | 查看DNA双螺旋动画 | 动画流畅旋转 |
| 添加记录 | 添加新的消费记录 | 记录成功保存 |
| 分类选择 | 选择不同消费类型 | 类型正确显示 |
| 月份切换 | 切换不同月份 | 数据正确筛选 |
| 统计展示 | 查看消费统计 | 百分比计算正确 |
| 日期格式 | 查看日期显示 | 格式化正确 |
八、扩展方向
8.1 后端集成
┌─────────────┐ HTTPS ┌─────────────┐
│ 客户端 │ ←─────────────→ │ 服务器 │
└─────────────┘ └─────────────┘
│ │
│ 消费数据同步 │
│ 用户认证 │
│ 数据分析 │
│ 云端备份 │
↓ ↓
┌─────────────┐ ┌─────────────┐
│ 本地存储 │ │ 云端数据库 │
└─────────────┘ └─────────────┘
8.2 功能扩展计划
| 版本 | 功能 | 描述 |
|---|---|---|
| v1.1 | 数据持久化 | 本地数据库存储 |
| v1.2 | 消费趋势 | 周/月/年趋势分析 |
| v1.3 | 预算管理 | 设置消费上限提醒 |
| v1.4 | 智能分类 | 自动识别消费类型 |
| v1.5 | 社区分享 | 分享消费DNA图谱 |
8.3 高级功能
九、使用场景
9.1 典型使用场景
🧬 消费DNA使用场景 🧬
| 场景 | 描述 | 使用频率 |
|---|---|---|
| 日常记账 | 记录每日消费支出 | 每日多次 |
| 月度回顾 | 查看本月消费情况 | 每月一次 |
| 分类分析 | 分析各类消费占比 | 每周一次 |
| 消费洞察 | 观察消费习惯模式 | 不定期 |
| 预算规划 | 规划下月消费预算 | 每月一次 |
9.2 记账建议
┌─────────────────────────────────────────────────────────┐
│ 记账建议 │
├─────────────────────────────────────────────────────────┤
│ │
│ 📝 记录习惯 │
│ • 消费后立即记录,避免遗忘 │
│ • 准确填写金额和描述 │
│ • 选择正确的消费类型 │
│ • 定期回顾消费记录 │
│ │
│ 💡 分析技巧 │
│ • 观察DNA螺旋的颜色分布 │
│ • 关注高频消费类型 │
│ • 对比不同月份的变化 │
│ • 发现消费规律和问题 │
│ │
│ 🎯 改善方向 │
│ • 设定合理的消费预算 │
│ • 控制非必要支出 │
│ • 优化消费结构 │
│ • 培养良好消费习惯 │
│ │
└─────────────────────────────────────────────────────────┘
十、可视化原理
10.1 DNA双螺旋结构
| 元素 | 含义 | 视觉表现 |
|---|---|---|
| 双螺旋 | 消费行为的双重性 | 蓝红双色曲线 |
| 节点 | 单笔消费记录 | 彩色圆点+emoji |
| 颜色 | 消费类型 | 类别对应颜色 |
| 旋转 | 时间流动 | 持续旋转动画 |
| 密度 | 消费频次 | 节点分布密度 |
10.2 可视化设计理念
🧬 DNA可视化设计理念 🧬
螺旋密度
- 节点越密集,说明消费越频繁
- 节点稀疏,说明消费较少
颜色分布
- 不同颜色代表不同消费领域
- 颜色占比反映消费偏好
旋转动态
- 象征消费行为的流动性
- 体现时间维度的变化
节点大小
- 可扩展为反映消费金额
- 金额越大节点越大
十一、消费心理学
11.1 消费行为分析
| 消费类型 | 心理动机 | 典型特征 |
|---|---|---|
| 餐饮 | 生理需求、社交 | 高频、刚需 |
| 交通 | 出行需求 | 固定、规律 |
| 购物 | 物质需求、情感补偿 | 冲动、波动 |
| 娱乐 | 精神需求、压力释放 | 周期性 |
| 居住 | 安全需求 | 大额、固定 |
| 教育 | 自我提升 | 投资性 |
11.2 消费习惯洞察
💡 消费习惯洞察 💡
通过DNA可视化,用户可以:
- 识别消费模式 - 发现自己的消费规律
- 发现消费问题 - 找出不合理的消费行为
- 优化消费结构 - 调整消费类型占比
- 培养良好习惯 - 建立健康的消费观念
十二、总结
消费DNA应用通过"消费习惯像DNA双螺旋一样展示"的核心理念,为用户提供了一种全新的消费记录和可视化方式。应用涵盖DNA可视化、消费记录、分类统计、月份筛选、日期格式化五大核心功能,让用户能够直观地了解自己的消费习惯。
应用采用青色主题,象征清新、专业。主页面清晰展示DNA双螺旋动画,月份选择器支持切换不同月份,统计区域展示各类消费占比,消费记录列表展示所有消费明细。
DNA双螺旋采用CustomPainter绘制,通过三角函数参数方程计算螺旋曲线坐标,消费记录以彩色节点的形式分布在螺旋上。旋转动画持续进行,象征消费行为的时间流动。
应用采用Material Design 3设计规范,遵循Flutter最佳实践,代码结构清晰,易于维护和扩展。后续版本计划增加数据持久化、消费趋势分析、预算管理、智能分类、社区分享等功能,为用户提供更完整的消费管理体验。
通过消费DNA应用,用户可以直观地了解自己的消费习惯,发现消费规律,优化消费结构,培养良好的消费习惯。
记录消费,解码生活 🧬
更多推荐




所有评论(0)