一、收藏/关注功能实现机制分析

1. 核心架构

数据流:UI操作 → 本地存储(SharedPreferences) → 持久化保存

2. 实现层次

1. 业务层 (HomePage, RepositoryDetailPage, UserDetailPage)
   │
2. 服务层 (PersistenceStorage)
   │
3. 存储层 (SharedPreferences → Android/iOS本地文件系统)

3. 数据存储格式

// 关注用户
_followedUsersKey = 'followed_users' -> List<String>

// 收藏仓库
_starredReposKey = 'starred_repositories' -> List<String>

4. 操作流程

用户点击"收藏" → PersistenceStorage.starRepository() 
              → SharedPreferences.setStringList()
              → 数据写入本地文件

二、SharedPreferences 详解

1. 什么是 SharedPreferences?

SharedPreferences 是 Flutter 中用于持久化存储简单数据的轻量级解决方案,它在底层分别使用:

  • Android: SharedPreferences API

  • iOS: NSUserDefaults

  • Web: LocalStorage

2. 核心特点

特性 说明
数据格式 仅支持基本类型:String, int, double, bool, List<String>
存储位置 App私有目录,其他应用无法访问
线程安全 所有操作都是异步的
适用场景 用户配置、登录状态、收藏列表等小型数据
不适合场景 大量结构化数据、频繁读写、复杂关系数据

3. SharedPreferences 的限制和注意事项

限制 解决方案
仅限小型数据 大型数据使用 SQLite 或文件存储
异步操作 必须使用 async/await
类型有限 复杂对象需要序列化(JSON)
无加密 敏感数据需要额外加密
可能阻塞 避免在主线程频繁读写

在鸿蒙内使用shared_preferences,我试了以下几种方法:

✅ 方案一:直接依赖 Flutter 官方 Pub 版 shared_preferences

在 pubspec.yaml 中添加 shared_preferences 依赖:

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.8
  shared_preferences: ^2.2.3

flutter pub get不会有问题,但是当你运行项目去收藏后会发现如下报错:

❌️Flutter 官方 Pub 仓库发布的 shared_preferences 包(如 shared_preferences: ^2.2.3),只适配了 Android、iOS、Web、Windows、macOS、Linux 六大平台,完全没有适配鸿蒙 (OpenHarmony) 系统。所以官方版缺少鸿蒙端的原生实现,运行时找不到getAll方法的平台代码,才会抛出MissingPluginException。


✅ 方案二:依赖鸿蒙适配版的 Git 远程仓库地址

查阅了很多资料,发现可以把pubspec.yaml 中 shared_preferences 依赖改为:

shared_preferences:
    git:
      url: https://atomgit.com/openharmony-tpc/flutter_packages.git
      path: packages/shared_preferences/shared_preferences
      ref: br_shared_preferences-v2.5.3_ohos

包括官方给出的依赖也是这样的,两种写法本质一致,都是拉取鸿蒙官方适配过的 shared_preferences 包:

dependencies:
  shared_preferences:
    git:
      url: "https://gitcode.com/openharmony-tpc/flutter_packages.git"
      path: "packages/shared_preferences/shared_preferences"

修改之后再次下载,发现进程一直卡着,应该是网络问题,试了很多次也没有用。


✅ 方案三:官网下载

期间来来回回尝试了很多次,也搜索了很多资料(一般都是以上两种方式)。既然 Git 远程拉取失败,就直接去鸿蒙官方仓库下载适配好的shared_preferences离线依赖包,然后在本地配置依赖路径,规避网络问题https://atomgit.com/openharmony-tpc/flutter_packages/tree/master/packages/shared_preferences/shared_preferences_ohos

这个目录下有两个核心包,都是我们需要的:
shared_preferences:Flutter 层的 Dart 代码核心包
shared_preferences_ohos:鸿蒙原生层的桥接插件包

把下载好的 shared_preferences 和 shared_preferences_ohos 两个文件夹,完整复制到这个新建的文件夹中。

打开鸿蒙shared_preferences根目录 pubspec.yaml 文件,替换为本地路径依赖配置

回到鸿蒙fluttter pub get就可以下载完成!

4. 代码中的应用

3.1 写入数据
static Future<void> followUser(String username) async {
  final prefs = await _getPrefs();
  final followed = prefs.getStringList(_followedUsersKey) ?? [];
  if (!followed.contains(username)) {
    followed.add(username);
    await prefs.setStringList(_followedUsersKey, followed);
  }
}
3.2 读取数据
static Future<bool> isFollowingUser(String username) async {
  final prefs = await _getPrefs();
  final followed = prefs.getStringList(_followedUsersKey) ?? [];
  return followed.contains(username);
}
3.3 删除数据
static Future<void> unfollowUser(String username) async {
  final prefs = await _getPrefs();
  final followed = prefs.getStringList(_followedUsersKey) ?? [];
  followed.remove(username);
  await prefs.setStringList(_followedUsersKey, followed);
}

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

Logo

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

更多推荐