一、应用画像

维度E-Brufen
类型心理健康 / 情绪管理
平台HarmonyOS (6.1.0 / API 23)
框架Flutter 3.6.2+
语言Dart 100%(零 Kotlin / Swift / ArkTS 业务代码)
网络完全离线,零网络权限
存储Hive CE(纯 Dart 键值存储)
状态管理ChangeNotifier(零第三方状态库)
UI 范式Material 3
代码规模约 2000 行 Dart(13 个源文件)
页面数4 个主页面 + 首页
依赖数量仅 hive_ce + hive_ce_flutter 两个核心依赖

二、完整技术架构图

┌──────────────────────────────────────────────────────────────────┐
│                        UI Layer (Pages)                          │
│                                                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐   │
│  │  HomePage    │  │  DiaryPage   │  │  BreathePage         │   │
│  │  首页        │  │  情绪日记     │  │  呼吸练习             │   │
│  │              │  │  · 记录 Tab   │  │  · 模式选择           │   │
│  │  · 问候语    │  │  · 时间线 Tab │  │  · 呼吸动画           │   │
│  │  · 3 功能卡  │  │  · 统计 Tab   │  │  · 暂停/继续          │   │
│  │  · 今日速记  │  │              │  │                      │   │
│  └──────┬───────┘  └──────┬───────┘  └──────────┬───────────┘   │
│         │                 │                      │               │
│  ┌──────┴─────────────────┴──────────────────────┴───────────┐   │
│  │               SoundscapePage (白噪音 · 放松)               │   │
│  │   场景选择 → 定时器 → 视觉脉冲动画(无音频、纯视觉)        │   │
│  └────────────────────────────────────────────────────────────┘   │
│                                                                  │
│               ↓ 监听 (addListener) / 数据流向                     │
│                                                                  │
├──────────────────────────────────────────────────────────────────┤
│                       Widget Layer (可复用组件)                    │
│                                                                  │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐   │
│  │  HomeCard    │  │  MoodPicker  │  │  MoodChart            │   │
│  │  渐变功能卡片 │  │  5 表情选择器 │  │  周情绪柱状图(自绘) │   │
│  │  · emoji     │  │  · 缩放动画  │  │  · 按日聚合均值       │   │
│  │  · 渐变背景  │  │  · 高亮状态  │  │  · 颜色映射           │   │
│  │  · 点击跳转  │  │              │  │  · 总结文案           │   │
│  └──────────────┘  └──────────────┘  └──────────────────────┘   │
│                                                                  │
│  ┌──────────────────────────────────────────────────────────┐    │
│  │              BreathingCircle (呼吸动画球)                  │    │
│  │  模式支持: 4-7-8 呼吸法 / 盒式呼吸 / 放松呼吸             │    │
│  │  动画: AnimationController + Timer 驱动缩放 + 透明度        │    │
│  │  状态: pause() / resume() / 阶段标签回调                   │    │
│  └──────────────────────────────────────────────────────────┘    │
│                                                                  │
│               ↓ 读写数据 / 触发 notifyListeners()                 │
│                                                                  │
├──────────────────────────────────────────────────────────────────┤
│                     State / Data Layer                           │
│                                                                  │
│  ┌─────────────────────────────────┐  ┌─────────────────────┐    │
│  │  MoodStorage                   │  │  AppSettings        │    │
│  │  extends ChangeNotifier        │  │  (plain Dart class) │    │
│  │                                │  │                     │    │
│  │  · insert() → notifyListeners │  │  · selectedScene    │    │
│  │  · update() → notifyListeners │  │  · timerDuration    │    │
│  │  · delete() → notifyListeners │  │  · breatheMode      │    │
│  │  · getAll() / getByDate()     │  │  · breatheMinutes   │    │
│  │  · getByWeek()                │  │                     │    │
│  │  · getWeeklyMoodCounts()      │  │  isReady 状态检查    │    │
│  └───────────────┬─────────────────┘  └──────────┬──────────┘    │
│                  │                                │               │
│                  ↓ 读写                            ↓ 读写          │
│                                                                  │
├──────────────────────────────────────────────────────────────────┤
│                      Storage Layer                               │
│                                                                  │
│  ┌──────────────────────────┐    ┌──────────────────────────┐    │
│  │  Hive CE Box: 'moods'    │    │  Hive CE Box: 'settings' │    │
│  │                          │    │                          │    │
│  │  Key: int (自增 ID)      │    │  Key: String             │    │
│  │  Value: JSON String      │    │  Value: 原始类型          │    │
│  │  编码: jsonEncode/Decode │    │  · String (场景/模式)    │    │
│  │  内容: MoodEntry 序列化   │    │  · int (定时/时长)       │    │
│  │                          │    │                          │    │
│  │  操作: CRUD + 时间查询    │    │  操作: get/set + 默认值  │    │
│  └────────────┬─────────────┘    └────────────┬─────────────┘    │
│               │                                │                  │
│               ↓ 持久化(文件系统)                ↓                  │
│                                                                  │
├──────────────────────────────────────────────────────────────────┤
│                    HarmonyOS Platform                            │
│                                                                  │
│  ┌──────────────────────────────────────────────────────────┐    │
│  │  EntryAbility.ets  →  Flutter Engine  →  Dart VM         │    │
│  │  hvigor 构建  →  HAP 签名  →  真机部署                    │    │
│  │                                                          │    │
│  │  构建配置: ohos/build-profile.json5                      │    │
│  │  应用元信息: ohos/AppScope/app.json5                     │    │
│  │  图标资源: ohos/AppScope/resources/base/media/           │    │
│  │  签名: .p12 + .p7b + .cer 证书链                         │    │
│  └──────────────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────────────┘

数据流示意:

用户操作 → Page(setState) → Widget rebuild
    ↓
用户保存数据 → MoodStorage.insert/update/delete
    ↓
MoodStorage.notifyListeners()
    ↓
Page.addListener 回调 → setState → Widget 刷新
    ↓
Hive.put() → 文件系统持久化

三、六大技术决策

决策 1:为什么是 Flutter?

背景:HarmonyOS 原生开发使用 ArkTS + ArkUI,而 Flutter 通过其鸿蒙引擎提供了一条跨平台路径。

决策理由:

维度FlutterArkTS 原生
跨平台潜力Android / iOS / Web / 鸿蒙,一套代码仅鸿蒙
组件生态Material 3 开箱即用需从零搭建
热重载支持(秒级)不支持
学习成本Dart 一门语言ArkTS + 鸿蒙 API
社区资源全球活跃国内为主

关键代码——main.dart 入口:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Step 1: Hive CE 初始化
  await Hive.initFlutter();

  // Step 2: 设置持久化
  final settings = AppSettings();
  await settings.init();

  // Step 3: 情绪存储
  final moodStorage = MoodStorage();
  await moodStorage.init();

  // 启动
  runApp(EBrufenApp(settings: settings, moodStorage: moodStorage));
}

收益:

  • 代码 100% Dart,没有 Kotlin/Swift/ArkTS 平台通道
  • 未来可零成本编译到 Android/iOS
  • Material 3 提供了完整的设计语言,无需单独设计

决策 2:为什么是 ChangeNotifier 而非 Provider / Bloc / Riverpod?

背景:Flutter 状态管理方案众多。E-Brufen 选择了最轻量的原生方案。

多方案对比:

方案依赖模板代码学习曲线适用规模
ChangeNotifier零(Flutter 内置)极少极低小型应用
Providerprovider 包中等(context.read<T>())低中小型
Blocflutter_bloc大量(Event + State + Bloc)高中大型
Riverpodriverpod中等中中大型

E-Brufen 的实际情况:

  • 5 个页面,2 个数据源(MoodStorage + AppSettings)
  • 状态变更路径简单:用户操作 → 数据更新 → UI 刷新
  • 不需要跨层级传递、不需要依赖注入容器

ChangeNotifier 在本项目中的使用模式:

// 数据层:继承 ChangeNotifier
class MoodStorage extends ChangeNotifier {
  Future<int> insert(MoodEntry entry) async {
    await _box?.put(id, jsonEncode(data));
    notifyListeners();  // ← 通知所有监听者
    return id;
  }
}

// UI 层:注册监听
class _DiaryPageState extends State<DiaryPage> {
  
  void initState() {
    super.initState();
    widget.moodStorage.addListener(_loadMoods);  // ← 注册回调
    _loadMoods();
  }

  void _loadMoods() {
    setState(() {
      _allMoods = widget.moodStorage.getAll();   // ← 重新读取
    });
  }

  
  void dispose() {
    widget.moodStorage.removeListener(_loadMoods); // ← 清理
    super.dispose();
  }
}

为什么不过度设计:

  • Provider 的 context.read<T>() 模板代码远超本项目的复杂度收益
  • Bloc 的 Event/State/Bloc 三层抽象对 2000 行代码是过度架构
  • 原生 addListener + notifyListeners 模式零依赖、零学习成本、完全可控

决策 3:为什么是 Hive CE 而非 SQLite?

背景:Flutter 生态中 SQFlite 是最常见的本地存储方案,但它依赖原生 SQLite 库。

关键对比:

维度Hive CESQFlite
实现方式纯 Dart(零原生依赖)Dart FFI + 原生 SQLite .so
鸿蒙兼容完全兼容不兼容(鸿蒙 Flutter 引擎无原生 SQLite)
数据模型键值对(Box)关系型表
查询能力手动遍历 + 过滤SQL 查询
读写速度快(直接序列化)中(SQL 解析开销)
类型安全手动序列化有限(需手写映射)
迁移轻量需要 migration 脚本

Hive CE 在本项目中的使用:

// settings Box —— 简单键值对
class AppSettings {
  Box? _box;

  Future<void> init() async {
    _box = await Hive.openBox('settings');
  }

  String get selectedScene =>
      _box?.get('selectedScene', defaultValue: '雨中办公') ?? '雨中办公';

  set selectedScene(String v) => _box?.put('selectedScene', v);
}

// moods Box —— JSON 字符串值
class MoodStorage extends ChangeNotifier {
  static const _boxName = 'moods';
  Box? _box;
  int _nextId = 1;

  Future<int> insert(MoodEntry entry) async {
    final id = _nextId++;
    final data = entry.toJson();
    data['id'] = id;
    await _box?.put(id, jsonEncode(data));  // 以 JSON 字符串存储
    notifyListeners();
    return id;
  }
}

为什么不用 SQLite:

  • 鸿蒙 Flutter 引擎不提供原生 SQLite 支持,SQFlite 直接无法运行
  • E-Brufen 的数据结构天然适合键值模型:情绪记录以 ID 为键,设置以字符串为键
  • 无 JOIN 需求、无复杂关联查询 —— 遍历过滤即可满足所有业务需求

决策 4:为什么离线?

决策不仅仅关乎技术,更关乎产品哲学。

离线架构的含义:

传统在线应用:
  用户数据 → 服务器 → 数据库 → API 返回
  风险: 隐私泄露、服务器成本、合规负担

E-Brufen 离线应用:
  用户数据 → Hive CE → 设备本地文件
  特点: 零网络权限、零服务器、数据完全由用户掌控

检查 ohos/AppScope/app.json5 中的权限配置 —— 没有 ohos.permission.INTERNET,也没有任何网络相关权限声明。

三大收益:

收益说明
隐私安全情绪数据极其私密,不出设备 = 用户 100% 掌控
零运营成本无服务器、无数据库、无带宽费用
零合规风险不收集、不传输、不存储用户数据到云端,符合最严格的隐私法规
离线可用任何时候都能使用,不依赖网络连接

决策 5:为什么程序化生成音频 / 图标?

背景:独立开发者常见困境 —— 没有设计师、没有音频素材库、也不想引入外部版权问题。

E-Brufen 的解法:代码即资源。

程序化生成的范围:

资源类型生成方式工具
应用图标Dart 代码绘制 → PNG 导出dart:ui Canvas + ui.Image.toByteData()
呼吸引导数学函数生成(正弦波、包络)Dart dart:math
视觉脉冲动画控制器 + 数学插值Flutter AnimationController

设计哲学:

  • 可复现:任何开发者拉取代码即可生成完全一致的资源
  • 可定制:修改参数即可调整颜色、大小、频率
  • 零版权风险:所有资源由代码生成,无外部素材依赖
  • 版本可控:生成脚本纳入 Git,资源变更可追溯

实际效果:运行 dart run scripts/generate_icons.dart 即可在 ohos/AppScope/resources/base/media/ 下生成所有需要的图标文件(app_icon.png、1.png 等),完全自动化,无需任何外部图片工具。


决策 6:为什么没有音频播放插件?

背景:白噪音放松功能通常需要音频播放。E-Brufen 的 SoundscapePage 当前是纯视觉体验。

原因分析:

因素现状
鸿蒙 Flutter 音频插件生态不成熟,audioplayers 等主流包不支持鸿蒙
纯 Dart 音频方案dart:ffi 方式在鸿蒙上受限
应用定位E-Brufen 定位为 “小而美” 的 MVP,功能优先级明确

SoundscapePage 的当前实现:

// 纯视觉放松体验(无音频依赖)
class SoundscapePage extends StatefulWidget {
  // 场景选择 → 定时器 → 脉冲动画
  // 4 个场景:海边入眠 / 雨中办公 / 森林冥想 / 篝火夜读
  // 脉冲动画: AnimatedBuilder + AnimationController + 数学缩放
}

规划路线:

  • 短期(当前版本):视觉脉冲动画 + 沉浸式 UI 作为放松入口
  • 中期(下一版):自研纯 Dart WAV 合成(用数学算法生成雨声/海浪等环境音)
  • 长期:待鸿蒙 Flutter 音频插件生态成熟后集成原生播放能力

四、技术决策总结矩阵

#决策选择替代方案核心原因
1跨平台框架FlutterArkTS / React Native鸿蒙引擎可用、跨平台潜力、Dart 生态
2状态管理ChangeNotifierProvider / Bloc / Riverpod应用规模小、零依赖、无模板代码
3本地存储Hive CESQFlite / SharedPreferences纯 Dart 实现、鸿蒙兼容、键值够用
4网络策略完全离线REST API / Firebase隐私优先、零成本、零合规风险
5资源策略程序化生成手动设计 / 购买素材可复现、可定制、零版权
6音频播放暂不使用audioplayers / just_audio鸿蒙插件生态不成熟、MVP 优先级

五、系列文章导航(完整 50 篇)

本系列共 50 篇文章,覆盖鸿蒙 Flutter 开发全流程:

第一篇:环境搭建与入门(Post 01-10)

编号文章标题核心内容
01鸿蒙 Flutter 开发环境搭建DevEco Studio + Flutter SDK + 模拟器配置
02创建第一个鸿蒙 Flutter 项目flutter create + 项目结构解析
03Flutter 项目目录结构详解lib / ohos / android / ios 目录职责
04Dart 基础速览变量、函数、类、异步、空安全
05Flutter Widget 核心概念StatelessWidget / StatefulWidget / BuildContext
06Material 3 主题系统入门ColorScheme / ThemeData / 品牌色定制
07Hive CE 安装与初始化hive_ce + hive_ce_flutter 依赖引入与 Box 打开
08鸿蒙签名与证书配置.p12 / .p7b / .cer 证书链,签名流程
09真机调试与 HAP 安装DevEco Studio 连接真机、HAP 构建与部署
10技术选型全景(本文)架构总览、六大决策、学习路线图

第二篇:核心功能实现(Post 11-20)

编号文章标题核心内容
11情绪数据模型设计MoodType 枚举、MoodEntry 类、序列化
12MoodStorage 存储层实现ChangeNotifier + Hive CE CRUD 完整实现
13AppSettings 设置持久化Hive Box 键值存取、默认值策略
14首页 UI 构建HomePage 布局、问候语、功能卡片
15HomeCard 组件设计可复用渐变卡片、emoji + 标题 + 副标题
16情绪日记 —— 记录 TabMoodPicker 集成、日期选择、保存逻辑
17情绪日记 —— 时间线 Tab按月分组、ListView、详情 BottomSheet
18情绪日记 —— 统计 TabMoodChart 周柱状图、总结文案生成
19情绪日记 CRUD 完整实现编辑、删除、SnackBar 反馈
20今日速记功能HomePage 快速记录、Tooltip、错误处理

第三篇:架构与状态管理(Post 21-30)

编号文章标题核心内容
21ChangeNotifier 模式深入addListener / notifyListeners 生命周期
22数据流向全景图UI → Widget → State → Storage 单向数据流
23main.dart 启动流程剖析分步初始化、错误处理、_ErrorApp 降级
24页面间导航设计Navigator.push / MaterialPageRoute / 传参模式
25组件树与 Widget 复用策略HomeCard / MoodPicker / MoodChart 抽取原则
26状态提升与数据共享MoodStorage 跨页面共享、单例模式
27错误处理与降级策略FlutterError.onError / try-catch / 优雅降级 UI
28生命周期管理initState / dispose / mounted 检查
29性能优化实践const 构造器、ListView.builder、避免不必要的 rebuild
30架构决策回顾与反思技术债盘点、未来演进方向

第四篇:动画、UI 与资源生成(Post 31-42)

编号文章标题核心内容
31AppTheme 全局主题设计品牌色、渐变、Material 3 ThemeData
32MoodPicker 动画实现AnimatedScale、选中高亮、GestureDetector
33MoodChart 自绘柱状图周数据聚合、颜色映射、AnimatedContainer
34BreathingCircle 呼吸动画AnimationController + Timer 联动、缩放 + 透明度
35呼吸模式设计(4-7-8 / 盒式 / 放松)BreathePattern 数据模型、阶段切换逻辑
36呼吸练习完整流程模式选择 → 开始 → 暂停/继续 → 完成弹窗
37SoundscapePage 视觉脉冲AnimatedBuilder + AnimationController 数学缩放
38场景选择与定时器ChoiceChip、Timer 倒计时、触觉反馈
39程序化应用图标生成dart:ui Canvas 绘制 → PNG 导出脚本
40程序化音频合成原理正弦波、白噪声、包络生成数学基础
41自定义动画组件开发总结AnimationController / Tween / AnimatedBuilder 模式
42Material 3 主题定制深入ColorScheme.fromSeed / 组件主题覆盖

第五篇:测试、发布与总结(Post 43-50)

编号文章标题核心内容
43单元测试实践MoodEntry 序列化测试、MoodStorage CRUD 测试
44Widget 测试入门pumpWidget / find / tap 基础用法
45集成测试与 Golden 测试页面截图对比、完整流程测试
46鸿蒙 HAP 构建配置build-profile.json5、签名配置、版本号管理
47AppGallery 发布流程应用信息填写、审核要点、元数据准备
48CI/CD 流水线搭建GitHub Actions / 自动构建 / 自动签名
49项目复盘与经验总结技术决策回顾、踩坑记录、最佳实践
50系列终章:从零到发布的鸿蒙 Flutter 之旅完整学习路径、开源计划、社区贡献

六、学习路线图

按角色和阶段规划的学习路径:

阶段一:快速入门(Post 01-05,约 3 天)

目标:跑起第一个鸿蒙 Flutter 应用

01 环境搭建 ──→ 02 创建项目 ──→ 03 目录结构
                  │
                  └──→ 04 Dart 基础 ──→ 05 Widget 概念

关键产出:DevEco Studio 可用、模拟器运行成功、理解 Widget 树

阶段二:基础建设(Post 06-10,约 2 天)

目标:理解项目基础设施

06 Material 3 ──→ 07 Hive CE ──→ 08 签名配置
                                        │
09 真机调试 ←────────────────────────────┘
      │
      └──→ 10 技术选型全景(本文)

关键产出:主题定制能力、本地存储可用、签名配置完成

阶段三:核心功能(Post 11-20,约 5 天)

目标:实现情绪日记完整功能

11 数据模型 ──→ 12 MoodStorage ──→ 14 首页 UI
                    │                    │
13 AppSettings ←────┘                    │
                                         │
15 HomeCard ──→ 16 记录Tab ──→ 17 时间线Tab
                                         │
18 统计Tab ←──── 19 CRUD完整 ←── 20 今日速记

关键产出:完整的情绪日记 CRUD 功能、带统计图表

阶段四:架构深入(Post 21-30,约 4 天)

目标:理解架构设计思想

21 ChangeNotifier ──→ 22 数据流全景 ──→ 23 main.dart 剖析
                                             │
24 页面导航 ←── 25 组件复用 ←── 26 状态提升
                                             │
27 错误处理 ──→ 28 生命周期 ──→ 29 性能优化 ──→ 30 架构回顾

关键产出:状态管理能力、架构设计思维、性能优化意识

阶段五:动画与资源(Post 31-42,约 6 天)

目标:掌握动画开发和资源生成

31 AppTheme ──→ 32 MoodPicker动画 ──→ 33 MoodChart自绘
                                            │
34 呼吸动画 ──→ 35 呼吸模式 ──→ 36 呼吸流程  │
                                            │
37 视觉脉冲 ──→ 38 场景定时器 ──→ 39 图标生成
                                        │
40 音频合成 ──→ 41 动画总结 ←── 42 M3深入

关键产出:AnimationController 熟练使用、程序化资源生成能力

阶段六:测试与发布(Post 43-50,约 5 天)

目标:完成测试、构建与发布

43 单元测试 ──→ 44 Widget测试 ──→ 45 集成测试
                                        │
46 HAP构建 ──→ 47 发布流程 ←──────────┘
    │
    └──→ 48 CI/CD ──→ 49 项目复盘 ──→ 50 系列终章

关键产出:完整测试覆盖、HAP 构建能力、AppGallery 发布经验

总体学习路径图

           ┌───────────────────────────────────────────────────────┐
           │               E-Brufen 学习路线图                       │
           │                                                       │
           │  阶段一 ────→ 阶段二 ────→ 阶段三 ────→ 阶段四          │
           │  快速入门      基础建设      核心功能      架构深入        │
           │  (3天)        (2天)        (5天)        (4天)          │
           │     │            │            │            │           │
           │     └────────────┴────────────┴────────────┘           │
           │                      │                                 │
           │                      ↓                                 │
           │              阶段五 ────→ 阶段六                        │
           │              动画资源      测试发布                      │
           │              (6天)        (5天)                        │
           │                                                       │
           │  总计约 25 天,完整覆盖鸿蒙 Flutter 开发全流程            │
           └───────────────────────────────────────────────────────┘

七、从本项目中你可以学到的技能清单

硬技能

分类具体技能对应文章
框架Flutter Widget 体系、StatefulWidget 生命周期05, 28
状态管理ChangeNotifier + addListener 模式21, 22, 26
本地存储Hive CE Box 操作、JSON 序列化07, 12, 13
UI 设计Material 3 主题定制、品牌色系统06, 31, 42
动画AnimationController、Tween、AnimatedBuilder32, 34, 37, 41
自绘自定义柱状图、Canvas 绘制图标33, 39
导航Navigator 2.0、页面传参24
平台鸿蒙签名证书、HAP 构建、hvigor08, 46
测试单元测试、Widget 测试、集成测试43, 44, 45
CI/CDGitHub Actions 自动化构建48
发布AppGallery 上架流程47

软技能

技能说明
技术选型能力理解"够用就好"原则,避免过度架构
离线优先思维隐私设计、零依赖外部服务
资源策略程序化生成 > 手动制作 > 购买素材
渐进增强MVP 先跑通核心闭环,再逐步完善
跨平台意识写一套代码,考虑多平台兼容性

八、项目文件结构速查

在这里插入图片描述

lib/
├── main.dart                    # 入口:初始化 → 启动应用
├── theme/
│   └── app_theme.dart           # 品牌色、渐变、Material 3 主题
├── models/
│   └── mood_entry.dart           # MoodType 枚举 + MoodEntry 数据类
├── data/
│   ├── mood_storage.dart         # 情绪 CRUD(ChangeNotifier)
│   └── settings.dart             # 设置持久化(plain Dart)
├── pages/
│   ├── home_page.dart            # 首页(问候 + 3 卡片 + 今日速记)
│   ├── diary/
│   │   └── diary_page.dart       # 情绪日记(3 Tab)
│   ├── breathe/
│   │   └── breathe_page.dart     # 呼吸练习(模式 + 动画)
│   └── soundscape/
│       └── soundscape_page.dart  # 白噪音放松(视觉脉冲)
└── widgets/
    ├── home_card.dart            # 可复用渐变功能卡片
    ├── mood_picker.dart          # 5 表情选择器
    ├── mood_chart.dart           # 周情绪柱状图
    └── breathing_circle.dart     # 呼吸动画球 + 模式定义

小结

E-Brufen 是一个 “小而美” 的项目 —— 代码量不到 2000 行,13 个 Dart 源文件,仅 2 个核心依赖,但覆盖了鸿蒙 Flutter 开发的几乎所有关键环节:

  1. 完整的技术架构:从 UI 到存储的五层分层架构
  2. 务实的选型决策:每一项选择都基于实际约束而非潮流
  3. 系统的知识体系:50 篇文章覆盖从入门到发布的完整路径
  4. 可复现的工程实践:代码即资源,拉取即运行

项目源码:https://gitcode.com/PengXiansheng/E-Brufen


作者简介:E-Brufen Dev,Flutter & 鸿蒙开发者,专注于跨平台移动应用开发与心理健康数字化。项目托管于 AtomGit,欢迎 Star 和 Issue 讨论。

系列文章:本文为《鸿蒙 Flutter 实战》系列第 10 篇。查看完整系列请访问项目文档目录。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐