开源鸿蒙跨平台:Flutter 详情页细化(实现关注收藏)
SharedPreferences 是 Flutter 中用于持久化存储简单数据的轻量级解决方案,它在底层分别使用:Android: SharedPreferences APIiOS: NSUserDefaultsWeb: LocalStorage在鸿蒙内使用shared_preferences,我试了以下几种方法:在中添加依赖:flutter pub get不会有问题,但是当你运行项目去收藏后会
一、收藏/关注功能实现机制分析
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
更多推荐




所有评论(0)