Flutter for HarmonyOS 开发学习 DAY 8:2048 游戏与记录保存功能实现
添加本地存储依赖创建个人中心和历史记录页面集成底部导航栏实现完整的 2048 游戏实现游戏记录的保存和显示使用保持页面状态使用ValueKey实现页面刷新双重存储策略(SharedPreferences + 内存缓存)完整的游戏逻辑和 UI 交互欢迎加入开源鸿蒙跨平台社区,获取更多支持和资源:https://openharmonycrossplatform.csdn.net。
在「游戏列表」基础上新增 个人中心、历史记录 与 嵌入式 2048 小游戏,并借助
shared_preferences完成本地持久化。代码之外,本文侧重讲「为什么这么做」与「还能怎么做」。
一、需求拆解与架构回顾
| 模块 | 用户价值 | 技术选型 | 备选方案 |
|---|---|---|---|
| 个人中心 | 统一入口,品牌感 | 纯 Flutter 页面 | 原生 Android 插件、HarmonyOS Ability |
| 历史记录 | 回溯行为,成就驱动 | shared_preferences + 内存缓存 |
SQLite、Hive、Drift |
| 2048 小游戏 | 提升停留时长 | Flutter 自绘 + 手势 | 接入第三方 SDK、WebView 嵌 H5 |
选型理由:
- 功能轻量,键值对即可满足,无需关系型查询
shared_preferences在 HarmonyOS 分支已验证兼容,iOS/Android 可无缝复用- 纯 Dart 实现减少平台差异,降低维护成本
二、依赖安装
dependencies:
shared_preferences: ^2.2.2
flutter pub get 之后,插件会在 HarmonyOS 侧自动生成:
SharedPreferencesPlugin.java→ 封装 AndroidSharedPreferencesPreferencesPlugin.h/m→ 封装 iOSNSUserDefaults
三、页面设计

1. 信息架构
- 头部:头像 + 昵称 → 未来可接入华为账号一键登录 (
Account Kit) - 核心功能:历史记录、我的收藏、设置、关于
- 事件埋点:每条
onTap都附带eventLabel,方便运营统计
2. 视觉 token
| 元素 | 取值 | 说明 |
|---|---|---|
| 圆角 | 12.dp |
与鸿蒙系统默认卡片保持一致 |
| 主色 | ColorScheme.primaryContainer |
自动跟随深色模式 |
| 图标 | Icons.xxx + IconTheme |
如需自定义,可替换为 SvgPicture |
设计建议:
使用Material You动态取色,应用图标与系统壁纸联动,可提升用户「原生感」评分。
四、历史记录

1. 模型设计
class GameRecord {
final String gameName; // 业务主键
final int score; // 可排序
final int duration; // 秒,方便做「时长排行榜」
final DateTime playTime; // 天然时间索引
final Map? extraData; // 预留扩展,例如 2048 的 maxTile
}
思考:
如果以后要做「每日首胜」或「七天连续登录」,playTime字段可直接复用,无需额外建表。
2. 存储策略(双保险)
| 层级 | 职责 | 生命周期 | 失败降级 |
|---|---|---|---|
| SharedPreferences | 持久化 | 卸载 App 前 | 写盘失败 → 记日志 |
| Memory Cache | 读加速 | 进程存活 | 读取失败 → 空列表 |
代码技巧:
在getAllRecords()里优先读磁盘,成功后再写回_memoryCache,保证「单数据源」原则。
3. 展示策略
- 时间格式化:
DateTime.now().difference()→ 「X 分钟前」降低认知负担 - 空页插画:使用
MediaQuery.size.width * 0.15动态适配平板与手机 - 刷新机制:
RefreshIndicator+ValueKey<int>强制重建HistoryPage,返回即更新
五、2048 小游戏:自绘还是 SDK?三条路线对比

GridView.builder+GestureDetector实现滑动- 逻辑与 UI 分离,
_moveLeft()纯函数,方便单元测试 - 支持键盘方向键(鸿蒙平板外接键盘场景)
核心算法(滑动合并)
List<int> _merge(List<int> row) {
final noZero = row.where((v) => v != 0).toList();
for (int i = 0; i < noZero.length - 1; i++) {
if (noZero[i] == noZero[i + 1]) {
noZero[i] *= 2;
noZero[i + 1] = 0;
score += noZero[i];
}
}
return [...noZero.where((v) => v != 0), ...List.filled(4 - noZero.length, 0)];
}
复杂度:O(n) 扫描 + O(n) 拷贝,n=4 可视为常数。
六、保存时机
| 时机 | 是否保存 | 理由 |
|---|---|---|
| 游戏结束 | ✅ | 用户最在意结果 |
| 按「重新开始」 | ✅ | 旧局面积分已生效 |
页面 dispose |
✅ | 防止退后台被系统回收 |
| 每步移动 | ❌ | 高频 IO,耗电且意义不大 |
代码实现:
统一入口_saveRecord({bool forceSave}),内部判断score > 0 || forceSave再落盘,避免「0 分」污染列表。
七、下一步可扩展方向
-
账号体系
接入华为账号 SDK,云端同步历史记录,换机不丢失 -
数据洞察
使用fl_chart生成「游戏时长趋势图」,助力用户自我管理 -
离线游戏包
将 2048 逻辑编译为.hap独立模块,实现「秒开」与「热更新」 -
评分系统
调用 HarmonyOSAppRatingClient原生弹窗,提升商店评分
结语
本文从「存储选型 → 页面体验 → 算法实现 → 性能保障」四个维度,完整呈现了 Flutter for HarmonyOS 下本地存储与游戏中心的落地过程。
欢迎加入开源鸿蒙跨平台社区,获取更多支持和资源: https://openharmonycrossplatform.csdn.net
更多推荐

所有评论(0)