Flutter 框架跨平台鸿蒙开发 - 孤独指数应用

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

一、项目概述

运行效果图

1.1 应用简介

孤独指数是一款独特的心理健康评估应用,通过多维度因素分析来量化用户的孤独程度。应用以蓝紫色为主色调,象征内省与平静。界面设计采用仪表盘风格,将抽象的孤独感受转化为直观的数值指标。

应用通过六个核心维度来评估孤独程度:社交频率、独处时长、情感状态、连接质量、归属感和自我价值。每个维度都有独立的权重系数,最终计算出综合的孤独指数。用户可以调整各因素的评分,实时查看指数变化,并获得个性化的改善建议。

1.2 核心功能

功能模块 功能描述 实现方式
孤独仪表盘 实时显示孤独指数 CustomPaint仪表盘
因素调节 调整各维度评分 Slider滑块
趋势分析 历史数据趋势图 CustomPaint折线图
雷达图分析 多维度可视化 CustomPaint雷达图
改善建议 个性化建议推荐 智能算法
记录保存 保存评估记录 本地存储

1.3 孤独等级划分

应用定义了五级孤独程度:

等级 名称 颜色 分数范围 说明
1 无孤独 #4CAF50 0-20 社交状态健康
2 轻微孤独 #8BC34A 21-40 正常范围内的孤独感
3 中度孤独 #FFEB3B 41-60 需要适度关注
4 高度孤独 #FF9800 61-80 建议采取行动改善
5 严重孤独 #F44336 81-100 建议寻求专业帮助

1.4 影响因素体系

因素 权重 描述
社交频率 25% 与他人互动的频率
独处时长 20% 每天独处的时间比例
情感状态 20% 内心的情感满足程度
连接质量 15% 人际关系的深度和质量
归属感 10% 对群体的归属感受
自我价值 10% 对自我价值的认同感

1.5 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
状态管理 setState -
动画系统 AnimationController -
目标平台 鸿蒙OS / Web API 21+

1.6 项目结构

复制代码
lib/
└── main_loneliness_index.dart
    ├── LonelinessIndexApp           # 应用入口
    ├── LonelinessLevel              # 孤独等级枚举
    ├── LonelinessFactor             # 影响因素模型
    ├── LonelinessRecord             # 记录模型
    ├── LonelinessIndexHomePage      # 主页面(底部导航)
    ├── _buildIndexPage              # 指数页面
    ├── _buildTrendPage              # 趋势页面
    ├── _buildAnalysisPage           # 分析页面
    ├── GaugePainter                 # 仪表盘绘制器
    ├── TrendChartPainter            # 趋势图绘制器
    └── RadarChartPainter            # 雷达图绘制器

二、设计理念

2.1 孤独指数可视化

孤独指数系统
指数仪表盘
趋势分析
深度分析
实时计算
等级显示
因素调节
历史趋势
等级分布
记录列表
雷达图
周度分析
洞察报告

2.2 孤独等级模型

孤独等级
无孤独
绿色标识
0-20分
社交健康
轻微孤独
浅绿标识
21-40分
正常范围
中度孤独
黄色标识
41-60分
适度关注
高度孤独
橙色标识
61-80分
采取行动
严重孤独
红色标识
81-100分
寻求帮助

2.3 色彩体系

应用采用蓝紫色为主色调:

颜色类型 色值 RGB 用途
主色 #5C6BC0 92,107,192 导航、按钮、强调
辅助色 #7986CB 121,134,203 渐变、次要元素
无孤独 #4CAF50 76,175,80 一级孤独
轻微孤独 #8BC34A 139,195,74 二级孤独
中度孤独 #FFEB3B 255,235,59 三级孤独
高度孤独 #FF9800 255,152,0 四级孤独
严重孤独 #F44336 244,67,54 五级孤独

2.4 指数计算流程

仪表盘 计算引擎 因素滑块 用户 仪表盘 计算引擎 因素滑块 用户 调整因素评分 传递评分数据 加权计算 确定孤独等级 更新显示 展示新指数


三、系统架构

3.1 整体架构图

Data Layer
Business Layer
Presentation Layer
主页面

LonelinessIndexHomePage
指数页
趋势页
分析页
仪表盘
因素调节
改善建议
趋势图
等级分布
历史记录
雷达图
周度分析
洞察报告
指数计算

加权算法
等级判定

范围映射
建议生成

智能推荐
LonelinessFactor

因素模型
LonelinessRecord

记录模型
LonelinessLevel

等级枚举

3.2 类图设计

manages
manages
uses
has
LonelinessIndexApp
+Widget build()
<<enumeration>>
LonelinessLevel
+none 无孤独
+mild 轻微孤独
+moderate 中度孤独
+high 高度孤独
+severe 严重孤独
+String label
+Color color
+int minScore
+int maxScore
+fromScore(int) : LonelinessLevel
LonelinessFactor
+String id
+String name
+String description
+IconData icon
+int weight
+int score
LonelinessRecord
+String id
+DateTime date
+int score
+LonelinessLevel level
+Map<String,int> factorScores
+String note
LonelinessIndexHomePage
-int _currentIndex
-List<LonelinessFactor> _factors
-List<LonelinessRecord> _records
-AnimationController _gaugeAnimationController
-AnimationController _pulseAnimationController
+int get _currentScore
+LonelinessLevel get _currentLevel
+void _updateFactorScore()
+void _saveRecord()

3.3 指数计算流程

仪表盘 计算引擎 状态管理 滑块 用户 仪表盘 计算引擎 状态管理 滑块 用户 拖动调节 更新因素评分 触发重新计算 加权求和 判定等级 更新动画 显示新指数


四、核心功能实现

4.1 孤独等级枚举

定义五级孤独程度:

dart 复制代码
enum LonelinessLevel {
  none('无孤独', Color(0xFF4CAF50), 0, 20),
  mild('轻微孤独', Color(0xFF8BC34A), 21, 40),
  moderate('中度孤独', Color(0xFFFFEB3B), 41, 60),
  high('高度孤独', Color(0xFFFF9800), 61, 80),
  severe('严重孤独', Color(0xFFF44336), 81, 100);

  final String label;
  final Color color;
  final int minScore;
  final int maxScore;

  const LonelinessLevel(this.label, this.color, this.minScore, this.maxScore);

  static LonelinessLevel fromScore(int score) {
    for (var level in LonelinessLevel.values) {
      if (score >= level.minScore && score <= level.maxScore) {
        return level;
      }
    }
    return LonelinessLevel.severe;
  }
}

4.2 影响因素模型

定义六个核心影响因素:

dart 复制代码
class LonelinessFactor {
  final String id;
  final String name;
  final String description;
  final IconData icon;
  final int weight;
  int score;

  LonelinessFactor({
    required this.id,
    required this.name,
    required this.description,
    required this.icon,
    required this.weight,
    this.score = 50,
  });
}

4.3 加权计算算法

孤独指数的加权计算逻辑:

dart 复制代码
int _calculateWeightedScore(Map<String, int> scores) {
  int totalWeight = 0;
  int weightedSum = 0;
  for (var factor in _factors) {
    final score = scores[factor.id] ?? factor.score;
    weightedSum += score * factor.weight;
    totalWeight += factor.weight;
  }
  return (weightedSum / totalWeight).round().clamp(0, 100);
}

int get _currentScore {
  return _calculateWeightedScore(
    {for (var f in _factors) f.id: f.score}
  );
}

4.4 仪表盘绘制

仪表盘的核心绘制逻辑:

dart 复制代码
class GaugePainter extends CustomPainter {
  final int score;
  final LonelinessLevel level;
  final double animation;

  @override
  void paint(Canvas canvas, Size size) {
    final center = Offset(size.width / 2, size.height);
    final radius = size.width / 2 - 10;

    // 绘制背景弧
    final bgPaint = Paint()
      ..color = Colors.grey[200]!
      ..style = PaintingStyle.stroke
      ..strokeWidth = 20
      ..strokeCap = StrokeCap.round;
    canvas.drawArc(
      Rect.fromCircle(center: center, radius: radius),
      pi, pi, false, bgPaint,
    );

    // 绘制渐变进度弧
    final gradient = SweepGradient(
      center: Alignment.bottomCenter,
      startAngle: pi,
      endAngle: 2 * pi,
      colors: [
        LonelinessLevel.none.color,
        LonelinessLevel.mild.color,
        LonelinessLevel.moderate.color,
        LonelinessLevel.high.color,
        LonelinessLevel.severe.color,
      ],
    );
    
    // 绘制指针和数值
    final animatedScore = score * animation;
    final needleAngle = pi + (animatedScore / 100) * pi;
    // ... 绘制指针逻辑
  }
}

4.5 趋势图绘制

趋势折线图的绘制逻辑:

dart 复制代码
class TrendChartPainter extends CustomPainter {
  final List<LonelinessRecord> records;

  @override
  void paint(Canvas canvas, Size size) {
    // 绘制网格线
    for (int i = 0; i <= 4; i++) {
      final y = padding + (chartHeight / 4) * i;
      canvas.drawLine(
        Offset(padding, y),
        Offset(size.width - padding, y),
        gridPaint,
      );
    }

    // 绘制折线
    final path = Path();
    for (int i = 0; i < points.length; i++) {
      if (i == 0) {
        path.moveTo(points[i].dx, points[i].dy);
      } else {
        path.lineTo(points[i].dx, points[i].dy);
      }
    }
    canvas.drawPath(path, linePaint);

    // 绘制数据点
    for (int i = 0; i < points.length; i++) {
      final pointPaint = Paint()
        ..color = LonelinessLevel.fromScore(records[i].score).color
        ..style = PaintingStyle.fill;
      canvas.drawCircle(points[i], 4, pointPaint);
    }
  }
}

4.6 雷达图绘制

多维度雷达图的绘制逻辑:

dart 复制代码
class RadarChartPainter extends CustomPainter {
  final List<LonelinessFactor> factors;

  @override
  void paint(Canvas canvas, Size size) {
    final center = Offset(size.width / 2, size.height / 2);
    final radius = min(size.width, size.height) / 2 - 40;

    // 绘制同心多边形网格
    for (int level = 1; level <= 5; level++) {
      final levelRadius = radius * level / 5;
      final path = Path();
      for (int i = 0; i < factors.length; i++) {
        final angle = (2 * pi * i / factors.length) - pi / 2;
        final x = center.dx + levelRadius * cos(angle);
        final y = center.dy + levelRadius * sin(angle);
        if (i == 0) path.moveTo(x, y);
        else path.lineTo(x, y);
      }
      path.close();
      canvas.drawPath(path, gridPaint);
    }

    // 绘制数据区域
    final dataPath = Path();
    for (int i = 0; i < factors.length; i++) {
      final angle = (2 * pi * i / factors.length) - pi / 2;
      final value = factors[i].score / 100;
      final x = center.dx + radius * value * cos(angle);
      final y = center.dy + radius * value * sin(angle);
      if (i == 0) dataPath.moveTo(x, y);
      else dataPath.lineTo(x, y);
    }
    dataPath.close();
    canvas.drawPath(dataPath, dataPaint);
  }
}

五、UI设计规范

5.1 配色方案

应用采用蓝紫色为主色调:

颜色类型 色值 用途
主色 #5C6BC0 导航、按钮、强调
辅助色 #7986CB 渐变、次要元素
无孤独 #4CAF50 一级孤独标识
轻微孤独 #8BC34A 二级孤独标识
中度孤独 #FFEB3B 三级孤独标识
高度孤独 #FF9800 四级孤独标识
严重孤独 #F44336 五级孤独标识

5.2 字体规范

元素 字号 字重 颜色
页面标题 20px Bold #000000
指数数值 36px Bold 等级颜色
等级标签 18px Bold 等级颜色
因素名称 14px Medium #000000
因素描述 12px Regular #666666

5.3 组件规范

5.3.1 仪表盘
复制代码
        100
         ╱╲
        ╱  ╲
       ╱    ╲
      ╱ 指针 ╲
     ╱   ●    ╲
    ╱    65    ╲
   ╱            ╲
  ╱______________╲
 0                100

 高度孤独
 孤独指数:65
5.3.2 因素调节卡片
复制代码
┌─────────────────────────────────────────┐
│ 👥 社交频率                         40   │
│    与他人互动的频率                      │
│    ├─────────●──────────┤               │
│                                         │
│ 👤 独处时长                         60   │
│    每天独处的时间比例                    │
│    ├───────────────●────┤               │
└─────────────────────────────────────────┘
5.3.3 趋势图
复制代码
┌─────────────────────────────────────────┐
│ 100 ─────────────────────────────────   │
│  75 ────────●───────────●───────────   │
│  50 ───●───────────●───────────────    │
│  25 ─────────────────────────────●──   │
│   0 ────────────────────────────────   │
│     1日   7日   14日   21日   30日      │
└─────────────────────────────────────────┘

六、交互设计

6.1 指数页面交互

拖动滑块
点击保存
查看建议
用户操作
操作类型
更新因素评分
保存当前记录
展开建议卡片
重新计算指数
更新仪表盘
更新等级显示
创建记录对象
添加到历史列表
显示保存成功

6.2 因素调节流程

UI 计算引擎 状态管理 滑块 用户 UI 计算引擎 状态管理 滑块 用户 拖动调节 更新因素分数 触发计算 加权求和 返回新指数 更新显示

6.3 页面切换状态

点击趋势Tab
点击分析Tab
点击指数Tab
点击分析Tab
点击指数Tab
点击趋势Tab
指数页
趋势页
分析页


七、数据分析

7.1 统计指标

统计项 计算方式 说明
当前指数 加权平均分 实时孤独程度
平均指数 历史记录平均值 整体孤独水平
等级分布 各等级记录占比 孤独程度分布
周度趋势 按周统计平均值 周期性变化

7.2 趋势分析

dart 复制代码
List<String> _generateInsights() {
  final insights = <String>[];
  
  if (_records.length >= 7) {
    final recentWeek = _records.sublist(_records.length - 7);
    final previousWeek = _records.length >= 14
        ? _records.sublist(_records.length - 14, _records.length - 7)
        : _records.sublist(0, _records.length - 7);
    
    final recentAvg = recentWeek.map((r) => r.score).reduce((a, b) => a + b) / 7;
    final previousAvg = previousWeek.map((r) => r.score).reduce((a, b) => a + b) /
        previousWeek.length;
    
    if (recentAvg > previousAvg + 5) {
      insights.add('近一周孤独指数上升了${(recentAvg - previousAvg).toStringAsFixed(1)}点');
    }
  }
  
  return insights;
}

7.3 建议生成

孤独等级 建议类型 具体建议
无孤独 维持建议 继续保持、帮助他人
轻微孤独 自我关怀 享受独处、培养兴趣
中度孤独 适度改善 规律社交、志愿者活动
高度孤独 积极行动 主动联系、培养爱好
严重孤独 专业帮助 心理咨询、社区支持

7.4 时间分布分析

时间段 分析维度 应用价值
按日 日指数变化 了解日常波动
按周 周度趋势 发现周期规律
按月 月度变化 追踪长期趋势
按年 年度总结 整体健康评估

八、扩展功能规划

8.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 仪表盘展示 因素调节 趋势分析 建议生成 数据导出 提醒功能 分享功能 云端同步 AI分析 社区支持 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 孤独指数开发计划

8.2 功能扩展建议

8.2.1 数据导出

支持数据导出功能:

  • 导出为CSV格式
  • 生成PDF报告
  • 分享给心理咨询师
  • 数据备份恢复
8.2.2 提醒功能

定期评估提醒:

  • 每日评估提醒
  • 每周趋势报告
  • 异常波动预警
  • 改善建议推送
8.2.3 社区支持

社区互助功能:

  • 匿名分享感受
  • 互助小组
  • 专业资源推荐
  • 心理健康知识

九、注意事项

9.1 开发注意事项

  1. 动画控制:AnimationController需要在dispose时释放

  2. 状态管理:使用setState管理本地状态,注意刷新时机

  3. 性能优化:CustomPaint绘制时避免重复创建对象

  4. 用户体验:指数变化要有过渡动画,避免突变

9.2 常见问题

问题 原因 解决方案
仪表盘不显示 动画未启动 检查forward调用
指数计算错误 权重配置问题 检查weight总和
趋势图为空 记录为空 检查_records
颜色不正确 等级映射错误 检查fromScore

9.3 使用提示

💙 孤独指数使用小贴士 💙

孤独是一种正常的情感体验。

定期评估有助于了解自己的状态。

指数仅供参考,如有需要请寻求专业帮助。

独处不等于孤独,享受独处时光。

提示:建议每天记录一次,持续追踪更有意义。


十、运行说明

10.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+

10.2 运行命令

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

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

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

# 运行到Windows
flutter run -d windows -t lib/main_loneliness_index.dart

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

十一、总结

孤独指数是一款独特的心理健康评估应用,通过多维度因素分析来量化用户的孤独程度。应用以蓝紫色为主色调,采用仪表盘风格,将抽象的孤独感受转化为直观的数值指标。

从技术实现来看,应用使用CustomPaint绘制仪表盘、趋势图和雷达图,通过加权算法计算综合指数,使用AnimationController实现流畅的动画效果。六个核心维度(社交频率、独处时长、情感状态、连接质量、归属感、自我价值)全面评估孤独程度。

从用户体验来看,应用提供直观的仪表盘展示,让用户能够实时了解自己的孤独状态。通过滑块调节各因素评分,操作简单直观。趋势分析功能让用户追踪长期变化,深度分析功能提供多维度洞察。个性化的改善建议帮助用户采取积极行动。

应用不仅是一个评估工具,更是一个自我认知的平台。它提醒我们:孤独是一种正常的情感体验;定期评估有助于了解自己的状态;指数仅供参考,如有需要请寻求专业帮助;独处不等于孤独,享受独处时光。在快节奏的现代生活中,孤独指数为我们提供了一种关注内心状态的方式。

量化孤独,理解自我


相关推荐
CheerWWW2 小时前
C++学习笔记——箭头运算符、std::vector的使用、静态链接、动态链接
c++·笔记·学习
浮芷.2 小时前
Flutter 框架跨平台鸿蒙开发 - 儿童技能打卡墙应用
科技·flutter·华为·harmonyos·鸿蒙
Utopia^2 小时前
Flutter 框架跨平台鸿蒙开发 - 重力感知
flutter·华为·harmonyos
芯智工坊2 小时前
第13章 Mosquitto监控与日志管理
前端·网络·人工智能·mqtt·开源
扬帆破浪2 小时前
开源的WPS AI文档编审软件适用场景:察元 AI 文档助手
人工智能·开源
ZhiqianXia2 小时前
Pytorch 学习笔记(17):decompositions.py —— 算子分解的百科全书
pytorch·笔记·学习
xian_wwq2 小时前
【学习笔记】大模型如何理解图片
笔记·学习
提子拌饭1332 小时前
昼夜节律下的肝脏代谢清除率演算仪:基于鸿蒙Flutter的双路流场与酶解粒子对照架构
flutter·华为·架构·harmonyos·鸿蒙
talen_hx2962 小时前
《零基础入门Spark》学习笔记 Day 13
笔记·学习·spark