在「游戏列表」基础上新增 个人中心历史记录嵌入式 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 → 封装 Android SharedPreferences
  • PreferencesPlugin.h/m → 封装 iOS NSUserDefaults

三、页面设计

在这里插入图片描述

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 分」污染列表。


七、下一步可扩展方向

  1. 账号体系
    接入华为账号 SDK,云端同步历史记录,换机不丢失

  2. 数据洞察
    使用 fl_chart 生成「游戏时长趋势图」,助力用户自我管理

  3. 离线游戏包
    将 2048 逻辑编译为 .hap 独立模块,实现「秒开」与「热更新」

  4. 评分系统
    调用 HarmonyOS AppRatingClient 原生弹窗,提升商店评分


结语

本文从「存储选型 → 页面体验 → 算法实现 → 性能保障」四个维度,完整呈现了 Flutter for HarmonyOS 下本地存储与游戏中心的落地过程。


欢迎加入开源鸿蒙跨平台社区,获取更多支持和资源: https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐