BSD 3-Clause "New" or "Revised" License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

深度解析 Flutter 3 心情记录示例工程 —— Mood-Example

项目背景与痛点

心情记录应用在移动开发领域已经不新鲜,但对于专注于Flutter的开发者,Amos Hu Ke 提出的“Mood-Example”项目为该类应用确立了一个新标杆。它不仅实现了基础的心情记录功能,而且提供了完整的国际化、深色模式、多主题以及本地数据管理等特性,满足了开发者在不同环境下的实用需求。尤其对于追求国际化与跨平台开发的开发者而言,Mood-Example 提供了一个有价值的示例。

这种应用解决了用户在日常生活中记录心情的需求,并且能够为用户提供一个直观的数据统计界面,这在长期跟踪个体情绪趋势时尤为重要。此外,通过深度支持iOS和Android平台,并且无缝集成到微信小程序中,用户可以享受到跨设备同步情感记录的乐趣。

核心技术揭秘

技术架构

Mood-Example 基于 Flutter 3 构建,运用了多种设计模式和技术栈来确保高效能与易用性。核心功能包括国际化支持、生命周期管理、状态管理、数据持久化以及图表统计。以下是项目的关键技术点:

  • 国际化 (i18n):通过引入 flutter_localizations 包,库能够提供多语言及本地化支持,增加了使用者地理覆盖面。
  • 路由管理:使用 Flutter 自带的 Navigator API 无缝切换页面,而状态管理由 Provider 或 GetX 实现,加强了应用内部的数据流动管理。
  • 深色模式:利用 ThemeData 不同的主题设置切换浅色与深色模式,实现了可感知的设计美学。
  • 多主题方案:开发者能够自定义应用主题,使得用户的使用体验更加个性化。
  • 本地数据管理:通过 SQLite 或 hive 存储心情记录,并可通过 HIVE 的读写接口访问数据。
  • Excel 导入导出:使用 excel 插件进行数据的导出与读取。
  • 无障碍(Semantics):通过 Flutter 的 Semantics 属性为视障用户提供便利。
数据流机制

下面的 Mermaid 图形描述了从用户启动应用到数据存储的处理流程:

graph TD A[用户请求] --> B{"参数校验"} B -->|"通过"| C[处理业务逻辑] B -->|"失败"| D[显示错误] C --> E[存储到本地]

核心设计

该项目在设计和实现上展示了诸多巧妙之处。最为亮眼的莫过于它的可扩展性和灵活的数据管理机制,使得开发人员可以在已有基础之上轻松添加新功能。虽然项目已相对完整,但源代码和文档的结构为新特性的整合预留了空间。

功能亮点与差异

Mood-Example 对比同类竞品,突出的技术亮点集中在:

  • 本地数据与图表统计:内置 Excel 导入导出,支持自定义图表统计,非常适合关注长期心情趋势的用户。
  • 深色模式和多主题支持:不仅提高了可访问性,也让应用具备了时尚感。
  • 无障碍功能:内置的 Semantics 支持让视障用户能够无障碍使用。

此外,该代码库中的实现方式不仅代表着最佳实践,同时也充满如新手引导、主题自定义这样富有创意的设计。

应用场景与落地建议

尽管 Mood-Example 项目的设置和主题极其吸引人,但在投入生产前需注意以下几点:

  • 兼容性测试:务必在目标平台上(iOS、Android、Web,如果有条件,也包括不同的Android版本之间)进行全面的测试。
  • 安全性与隐私:考虑在数据存储或传输过程中引入加密机制,以保护用户隐私及数据安全。
  • 性能优化:对于图表展示或数据库操作频繁的场景,值得进一步优化以提升响应速度和流畅度。

Mood-Example 相较于其他记录心情的 App 更加定制化、多平台兼容且富有创造性。项目非常适合作为个人开发者学习 Flutter 综合能力的案例,也适用于创业者快速搭建并发射喜爱的情感记录应用。

综合评价

Mood-Example 无疑是对 Flutter 生态的突出贡献,它的深度功能和卓越设计展现了 Flutter 开发的巨大潜力。项目积极推行最佳实践,为开发者在构建功能全面的所形所建提供了优质的蓝本。进一步的完善和功能增强将使这款心情记录应用变得无与伦比,非常适合要求贯穿应用体验并提供数据驱动情感洞察的开发者采纳。

简要分析

热度分
894
价值分
426
活跃状态
活跃

语言占比

C
C++
CSS
Dart
HTML
JavaScript
Kotlin
Objective-C
Ruby
Swift

README

Preview


Logo Mood Example

Mood-Example v1.9.14 Flutter v3.47.4 Dart v3.13.3 BSD-3-Clause License


情绪记录 样例工程
管理自己的情绪,记录当下所见所想,以及其他实验室功能(不定期更新一些功能)
运用 Flutter 的工程,主要目的是学习、实践。

[!NOTE]
注意:由于是学习实践工程,所以重点在于学习,许多业务逻辑可能并不符合现实。
Emoji 因设备缘故,会存在不同样式。

🌏 相关网站

Flutter 官网(中文):https://flutter.cn/
Flutter 官网(英文):https://flutter.dev/
Packages (原始站点) :https://pub.dev/
Packages (中国镜像) :https://pub-web.flutter-io.cn/

⭐ 功能

  • 国际化 i18n l10n
  • 多主题
  • 深色模式
  • 本地数据管理
  • 路由管理
  • 状态管理
  • 集成测试
  • 情绪记录
  • 图表统计
  • Excel 导入导出
  • 无障碍支持 (Semantics)
  • Web 访问
  • 解锁认证(锁屏密码、生物特征识别)
  • 本地通知
  • 动画
  • 实验室(占用 APP 大部分包体积,源码位置查看项目结构)
    • uniapp 小程序(UniMPSDK v4.85)
    • 游戏合集(Bonfire, Flame)
    • 3D 城市(obj 格式)
    • FFI (Hooks) 异步调用 C/C++
      ……

🛠️ 开发环境

🛠️ 基本环境

Windows:

[√] Flutter (Channel stable, 3.47.4, on Microsoft Windows)
[√] Android toolchain - develop for Android devices (Android SDK version 37.0.0)

macOS:

[✓] Flutter (Channel stable, 3.47.4, on macOS)
[✓] Android toolchain - develop for Android devices (Android SDK version 37.0.0)

🛠️ i18n l10n

官方国际化教程:中文站 | 英文站

├── lib/
│   ├── l10n/                   # l10n 语言包
│   │   ├── gen/                # l10n 语言包生成的文件夹(不用编码,自动生成)
│   │   └── app_zh_CN.arb       # 如 简体中文:zh_CN
│   ├── shared/
│   │   ├── config/
│   │   │   └── language.dart   # 语言配置
├── l10n.yaml                   # l10n 配置
......

🎉 启动

在 开发环境 支持的情况下

# 克隆项目
$ git clone https://github.com/AmosHuKe/Mood-Example.git

# 获取依赖
$ flutter pub get

# 启动项目或相关 IDE 启动
$ flutter run

# 更多启动模式
$ flutter run --debug/release/profile/test

# 清理构建缓存
$ flutter clean

# 集成测试
$ flutter test integration_test/app_test.dart --dart-define=test_mode=true

📑 项目结构

├── android/                                          # Android 工程文件 
│   ├── app/
│   │   ├── libs/                                     # 包含 UniMPSDK 依赖库
│   │   ├── src/
│   │   │   ├── main/
│   │   │   │   ├── assets/                           # 包含 UniMPSDK 内容
│   │   │   │   │   ├── apps/                         # 包含 UniMPSDK 的 uniapp 小程序
│   │   │   │   │   └── data/                         # 包含 UniMPSDK 内容
│   │   │   │   ├── kotlin/com/example/moodexample/
│   │   │   │   │   ├── channel/                      # Flutter 与 Android 原生通信
│   │   │   │   │   │   ├── UniMpMethodCallHandler.kt # UniMPSDK 方法分发
│   │   │   │   │   │   └── UniMpMethodChannel.kt     # UniMPSDK 通道注册
│   │   │   │   │   ├── unimp/
│   │   │   │   │   │   ├── config/
│   │   │   │   │   │   │   └── UniMpConfigFactory.kt # UniMPSDK 初始化配置
│   │   │   │   │   │   ├── manager/
│   │   │   │   │   │   │   └── UniMpManager.kt       # UniMPSDK 管理
│   └── └── └── └── └── MainActivity.kt               # Flutter 的 Android 默认入口
├── assets/                                           # 静态资源文件
├── build/                                            # 编译或运行后产物
├── hook/                                             # FFI Hooks
├── integration_test/                                 # 集成测试
│   └── app_test.dart                                 # 集成测试入口 用例
├── ios/                                              # iOS 工程文件
│   ├── Runner/                                       # Runner
│   │   ├── UniMP/                                    # UniMPSDK 原生接入
│   │   │   ├── Channel/
│   │   │   │   └── UniMPMethodChannel.swift          # UniMPSDK 通道注册
│   │   │   ├── Config/
│   │   │   │   └── UniMPLaunchOptionsBuilder.swift   # UniMPSDK 启动参数构建
│   │   │   ├── Manager/
│   │   │   │   └── UniMPManager.swift                # UniMPSDK 管理
│   │   │   ├── UniMPAppDelegate.swift                # UniMPSDK 生命周期代理
│   │   │   └── UniMPRegistrant.swift                 # UniMPSDK 能力注册
│   │   ├── UniMPSDK/                                 # 包含 UniMPSDK 内容
│   │   │   ├── Apps/                                 # 包含 UniMPSDK 的 uniapp 小程序
│   │   │   └── Core/                                 # 包含 UniMPSDK 依赖库
│   │   ├── AppDelegate.swift                         # Flutter 的 iOS 默认入口
│   │   ├── Info.plist                                # 项目配置
│   │   └── Runner-Bridging-Header.h                  # 依赖库引入
│   └── Podfile                                       # 依赖配置
├── lib/                                              # 工程相关文件(主要编码)
│   ├── data/                                         # 数据层
│   │   ├── dao/                                      # 原始数据访问操作
│   │   ├── database/                                 # 数据基础设施
│   │   │   ├── tables/                               # sqflite 数据表配置
│   │   │   ├── database.dart                         # sqflite 数据库相关
│   │   │   └── shared_preferences_db.dart            # shared_preferences 数据相关
│   │   └── repositories/                             # 仓库实现层(协调业务逻辑)
│   ├── domain/                                       # 领域层(业务抽象)
│   │   ├── models/                                   # 数据模型
│   │   ├── repositories/                             # 仓库抽象层(抽象业务接口)
│   │   └── use_cases/                                # 业务用例
│   ├── features/                                     # 视图
│   │   ├── home/                                     # 首页
│   │   ├── laboratory/                               # 实验室
│   │   │   ├── views/
│   │   │   │   ├── 3d/                               # 3D 城市
│   │   │   │   ├── ffi/                              # FFI 测试
│   │   │   │   ├── game/                             # 游戏合集
│   │   │   │   ├── tilt_example/                     # 倾斜视差卡片
│   │   │   │   ├── unimp_miniapps/                   # uniapp 小程序
│   │   │   └── └── laboratory.dart                   # 实验室首页
│   │   ├── mood/                                     # 心情页
│   │   ├── onboarding/                               # 用户引导页
│   │   ├── settings/                                 # 侧边设置栏
│   │   ├── statistic/                                # 统计页
│   │   ├── web_view/                                 # WebView
│   │   └── main_screen.dart                          # 主屏幕
│   ├── l10n/                                         # l10n 语言包
│   │   └── gen/                                      # l10n 语言包生成的文件夹(不用编码,自动生成)
│   ├── shared/                                       # 共享相关
│   │   ├── config/                                   # 配置
│   │   │   ├── dependencies.dart                     # 依赖注入
│   │   │   ├── language.dart                         # 语言配置
│   │   │   └── multiple_theme_mode.dart              # 多主题配置
│   │   ├── providers/                                # 状态管理
│   │   ├── themes/                                   # 主题相关
│   │   │   ├── multiple_theme_mode/                  # 多主题配色
│   │   │   │   └── theme_default.dart                # 多主题默认配色
│   │   │   └── app_theme.dart                        # 主题基础
│   │   └── utils/                                

提示:代码过长已自动截断

🤔️ 常见问题

Q: 小程序无法使用视频、地图等

点击展开

这是因为项目中只集成了核心基础库(因为仅作为集成演示),
许多功能库(比如视频、地图、分享、支付、登录、直播 pusher 等 SDK)没有集成,

如果你需要这些功能就需要自行集成。

比如在 iOS 中集成,需要先下载 UniMP_iOS_SDK ,
然后你会看见如下结构:

├── UniMPSDK/
│   ├── Core/         # 核心库
│   ├── Features/     # 非核心功能库
......

之后根据以下两个官方教程进行集成:

Q: 在 APP 关闭后,通知失效

点击展开

在确认应用开启了通知的情况下,关闭 APP 后依旧无法通知。
这是因为部分品牌 Android 默认使用了电池节能策略。

解决:关闭应用的电池节能策略,并打开自启动

📦 Packages

感谢开源

Packages License
bonfire MIT License
card_swiper MIT License
ditredi MIT License
excel MIT License
flame MIT License
file_picker MIT License
flutter_slidable MIT License
flutter_zoom_drawer MIT License
flutter_screen_lock MIT License
flutter_smart_dialog MIT License
flutter_tilt MIT License
provider MIT License
remixicon MIT License
awesome_notifications Apache-2.0 License
table_calendar Apache-2.0 License
sqflite BSD-2-Clause License
fl_chart BSD-3-Clause License
flutter_lints BSD-3-Clause License
intl BSD-3-Clause License
local_auth BSD-3-Clause License
logging BSD-3-Clause License
go_router BSD-3-Clause License
path_provider BSD-3-Clause License
share_plus BSD-3-Clause License
shared_preferences BSD-3-Clause License
webview_flutter BSD-3-Clause License

🖼️ Illustration

Illustration by Tanya Krasutska from Ouch!

📄 License

BSD-3-Clause License
Open sourced under the BSD-3-Clause license.
根据 BSD-3-Clause 许可证开源。
© AmosHuKe

评论

暂无评论