【Flutter for OpenHarmony】Flutter三方库心理健康App从零到一的鸿蒙化适配与实战指南

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


一、为什么我要做这个心理健康App?

我是 IntMainJhy,上海某高校大一计算机专业的学生。说起这个心理健康 App 的由来,其实有点巧合。

大一下学期期末考试周,我整个人都处于一种很焦虑的状态。晚上睡不着,白天没精神,复习效率特别低。我室友看我状态不对,推荐我用一款冥想 App,说他之前考研压力大的时候就是靠这个挺过来的。

我下载试了试,确实有点效果。但我发现那些 App 要么是收费的,要么界面太丑,要么功能太复杂。

我就想:要不自己做一个? 我是计算机专业的学生,学 Flutter 也有一段时间了,正好可以拿这个项目练练手。

于是,我的第一个"正经"Flutter 项目就这样开始了。


二、项目概述

2.1 项目目标

  • 做一个简单易用的心理健康工具
  • 包含心情记录、冥想、心理测试等核心功能
  • 支持 OpenHarmony 平台运行
  • 代码要规范,方便后续维护

2.2 技术栈

技术 用途 版本
Flutter 跨平台框架 3.8.1
Provider 状态管理 ^6.1.2
SharedPreferences 本地存储 ^2.3.5
fl_chart 图表 ^0.69.0
flutter_animate 动画 ^4.5.0
table_calendar 日历 ^3.1.2

三、项目架构设计

3.1 目录结构

lib/
├── main.dart                           # 应用入口
├── mental_health/
│   ├── models/                       # 数据模型
│   │   ├── mood_model.dart           # 心情模型
│   │   ├── meditation_model.dart     # 冥想模型
│   │   ├── quiz_model.dart          # 测试模型
│   │   ├── quote_model.dart         # 语录模型
│   │   └── breathing_model.dart     # 呼吸模型
│   │
│   ├── providers/                   # 状态管理
│   │   ├── mood_provider.dart       # 心情状态
│   │   ├── meditation_provider.dart  # 冥想状态
│   │   └── quiz_provider.dart       # 测试状态
│   │
│   ├── screens/                    # 页面
│   │   ├── mental_health_home_screen.dart
│   │   ├── mood_record_screen.dart
│   │   ├── meditation_screen.dart
│   │   ├── quiz_screen.dart
│   │   ├── breathing_screen.dart
│   │   └── quotes_screen.dart
│   │
│   ├── widgets/                     # 组件
│   │   ├── mood_emoji_widget.dart
│   │   ├── mood_chart_widget.dart
│   │   ├── mood_calendar_widget.dart
│   │   ├── meditation_card_widget.dart
│   │   ├── quiz_result_widget.dart
│   │   └── quote_card_widget.dart
│   │
│   ├── theme/                      # 主题配置
│   │   ├── app_colors.dart
│   │   └── app_theme.dart
│   │
│   └── utils/                      # 工具函数
│       └── streak_calculator.dart
│
└── router/
    └── app_router.dart             # 路由配置

3.2 架构设计原则

原则 说明
模块化 每个功能模块独立,互不干扰
分层 UI层、逻辑层、数据层分离
可复用 组件尽量设计成可复用
可测试 业务逻辑尽量抽离,方便测试

四、核心功能模块

4.1 心情记录模块

功能点

  • 5种情绪选择(开心、平静、一般、难过、疲惫)
  • 可添加文字笔记
  • 连续打卡天数统计
  • 历史记录查看

核心代码

// mood_provider.dart
class MoodProvider extends ChangeNotifier {
  List<MoodEntry> _entries = [];
  int _currentStreak = 0;

  Future<void> addMood(MoodType mood, {String? note}) async {
    final entry = MoodEntry(
      id: DateTime.now().millisecondsSinceEpoch.toString(),
      mood: mood,
      note: note,
      date: DateTime.now(),
    );
    _entries.insert(0, entry);
    await _saveEntries();
    await _updateStreak();
    notifyListeners();
  }
}

4.2 冥想模块

功能点

  • 7种冥想类型(放松、专注、睡眠、焦虑缓解等)
  • 自定义冥想时长
  • 计时器功能
  • 呼吸引导动画

核心代码

// meditation_provider.dart
class MeditationProvider extends ChangeNotifier {
  Timer? _timer;
  int _remainingSeconds = 0;
  bool _isRunning = false;

  void startMeditation(int minutes) {
    _remainingSeconds = minutes * 60;
    _isRunning = true;
    _startTimer();
    notifyListeners();
  }

  void _startTimer() {
    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (_remainingSeconds > 0) {
        _remainingSeconds--;
        notifyListeners();
      } else {
        stopMeditation();
      }
    });
  }
}

4.3 心理测试模块

功能点

  • PHQ-9 抑郁量表(9题)
  • GAD-7 焦虑量表(7题)
  • 结果解读和建议
  • 测试历史记录

核心代码

// quiz_provider.dart
class QuizProvider extends ChangeNotifier {
  Map<int, int> _answers = {};  // questionIndex -> selectedOption

  void selectAnswer(int questionIndex, int optionIndex) {
    _answers[questionIndex] = optionIndex;
    notifyListeners();
  }

  int calculateScore() {
    int total = 0;
    for (var entry in _answers.entries) {
      total += _questions[entry.key].scores[entry.value];
    }
    return total;
  }
}

4.4 呼吸训练模块

功能点

  • 5种呼吸模式(4-7-8、箱式呼吸等)
  • 呼吸引导动画
  • 进度和周期显示

4.5 每日语录模块

功能点

  • 32条正能量语录
  • 分类筛选
  • 每日自动推荐

五、状态管理架构

5.1 为什么选择 Provider?

对比 Provider BLoC GetX
上手难度 ⭐⭐ ⭐⭐⭐⭐ ⭐⭐
代码量
适用场景 中小型应用 大型复杂应用 快速开发
学习曲线 平缓 陡峭 平缓

对于心理健康 App 这种中小型应用,Provider 完全够用,而且代码量最少。

5.2 Provider 配置

// main.dart
void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => MoodProvider()..initialize()),
        ChangeNotifierProvider(create: (_) => MeditationProvider()..initialize()),
        ChangeNotifierProvider(create: (_) => QuizProvider()),
      ],
      child: const MentalHealthApp(),
    ),
  );
}

六、路由设计

6.1 使用 IndexedStack 实现底部导航

class MentalHealthRouter extends StatefulWidget {
  
  State<MentalHealthRouter> createState() => _MentalHealthRouterState();
}

class _MentalHealthRouterState extends State<MentalHealthRouter> {
  int _currentIndex = 0;

  static final List<Widget> _pages = [
    const MoodRecordScreen(),
    const MeditationScreen(),
    const QuizScreen(),
    const BreathingScreen(),
    const QuotesScreen(),
  ];

  
  Widget build(BuildContext context) {
    return Scaffold(
      body: IndexedStack(
        index: _currentIndex,
        children: [
          MentalHealthHomeScreen(
            onNavigate: (index) => setState(() => _currentIndex = index),
          ),
          ..._pages,
        ],
      ),
      bottomNavigationBar: _buildBottomNavBar(),
    );
  }
}

七、主题配色

7.1 配色方案

// app_colors.dart
class AppColors {
  static const Color primary = Color(0xFF6C63FF);
  static const Color secondary = Color(0xFF9B59B6);
  static const Color accent = Color(0xFFFF6B6B);

  static const Color moodHappy = Color(0xFF27AE60);
  static const Color moodCalm = Color(0xFF3498DB);
  static const Color moodNeutral = Color(0xFFF39C12);
  static const Color moodSad = Color(0xFFE74C3C);
  static const Color moodTired = Color(0xFF9B59B6);
}

7.2 Theme 配置

// app_theme.dart
ThemeData lightTheme = ThemeData(
  useMaterial3: true,
  primaryColor: AppColors.primary,
  scaffoldBackgroundColor: const Color(0xFFF8F9FE),
  colorScheme: ColorScheme.fromSeed(
    seedColor: AppColors.primary,
  ),
);

八、数据持久化

8.1 使用 SharedPreferences

// 保存心情记录
Future<void> _saveEntries() async {
  final prefs = await SharedPreferences.getInstance();
  final jsonList = _entries.map((e) => e.toJson()).toList();
  await prefs.setString('mood_entries', jsonEncode(jsonList));
}

// 加载心情记录
Future<void> initialize() async {
  final prefs = await SharedPreferences.getInstance();
  final entriesJson = prefs.getString('mood_entries');
  if (entriesJson != null) {
    final List<dynamic> decoded = jsonDecode(entriesJson);
    _entries = decoded.map((e) => MoodEntry.fromJson(e)).toList();
  }
}

九、OpenHarmony 适配

9.1 依赖适配

dependencies:
  shared_preferences: ^2.3.5
  shared_preferences_harmonyos: ^0.0.1  # 鸿蒙专用版本

9.2 注意事项

问题 解决方案
第三方库不兼容 使用鸿蒙专用版本或替换
fl_chart API 差异 使用 axisSide 代替 meta
动画性能 缩短动画时长

十、开发流程总结

10.1 开发步骤

1. 需求分析 → 2. 原型设计 → 3. 项目搭建 → 4. 模块开发
                                                      ↓
6. 测试优化 ← 5. 功能集成 ← ← ← ← ← ← ← ← ← ← ← ← ←

10.2 开发心得

  1. 先想清楚再动手

    • 在写代码之前,先把功能点、页面结构、数据流想清楚
    • 画个简单的流程图会很有帮助
  2. 模块化开发

    • 把大功能拆成小模块
    • 每个模块独立开发、测试
    • 最后再整合
  3. 及时测试

    • 不要等所有代码写完再测试
    • 每个小功能完成就测试一下
  4. 代码规范

    • 命名要清晰
    • 注释要写清楚
    • 格式要统一

十一、项目成果

11.1 功能完成度

功能模块 完成度
心情记录 100%
冥想 100%
心理测试 100%
呼吸训练 100%
每日语录 100%
数据统计 100%
OpenHarmony 适配 100%

11.2 代码统计

指标 数量
Dart 文件 22
代码行数 ~5000
第三方库 8
页面数 6
组件数 10+

十二、大一学生真实学习总结

说实话,做完这个项目,我从一个只会写 Demo 的小白,变成了能独立完成 App 开发的初级开发者。

最大的收获

  1. Flutter 开发能力提升

    • 掌握了 Provider 状态管理
    • 学会了自定义组件
    • 理解了数据持久化
  2. 工程化思维

    • 学会了模块化开发
    • 理解了分层架构
    • 重视代码规范
  3. 解决问题的能力

    • 遇到问题先分析
    • 善用搜索引擎
    • 多看官方文档

遇到的最大困难

OpenHarmony 适配是最难的部分。因为这个平台还比较新,很多第三方库的支持不完善,需要自己想办法解决。

给新手的建议

  1. 不要怕
    Flutter 入门真的不难,跟着官方文档走一遍就差不多了。

  2. 多实践
    看一百遍教程不如自己动手做一个项目。

  3. 善用工具
    DevTools、Flutter Inspector 都是好帮手。

  4. 保持耐心
    遇到问题很正常,解决问题的过程就是成长的过程。


作者:IntMainJhy
创作时间:2026年5月
在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐