在开发开源鸿蒙(OpenHarmony)跨平台应用时,实现用户关注和收藏功能是一个常见的需求场景。这类功能通常需要持久化存储用户的操作数据,以便下次打开应用时能够保持状态。Flutter作为跨平台开发框架,其官方提供的shared_preferences插件原本只支持Android、iOS等主流平台,但在鸿蒙系统上使用时却遇到了兼容性问题。
这个项目的核心目标是解决在鸿蒙系统上使用Flutter实现持久化存储的技术方案,特别是针对用户关注和收藏这类轻量级数据的存储需求。我们需要一个既能在鸿蒙系统上稳定运行,又能保持Flutter跨平台特性的解决方案。
在Flutter生态中,针对不同规模的数据存储需求,通常有以下几种解决方案:
对于关注/收藏功能这种只需要存储少量ID列表的场景,SharedPreferences是最合适的选择。它轻量、易用,且性能开销小。
整个功能的实现采用了典型的三层架构:
code复制业务层 (UI)
│
服务层 (PersistenceStorage)
│
存储层 (SharedPreferences)
这种分层设计的好处是:
Flutter官方提供的shared_preferences插件(2.2.3版本)默认不支持鸿蒙系统。当直接使用官方插件时,会抛出MissingPluginException异常,这是因为插件缺少鸿蒙平台的本地实现代码。
经过实践测试,我们总结了三种可行的适配方案:
yaml复制dependencies:
shared_preferences:
git:
url: "https://gitcode.com/openharmony-tpc/flutter_packages.git"
path: "packages/shared_preferences/shared_preferences"
对于国内开发者,推荐采用方案三(离线包方式),具体操作如下:
yaml复制dependencies:
shared_preferences:
path: ./third_party/shared_preferences
注意:确保下载的插件版本与你的Flutter SDK版本兼容。如果遇到问题,可以尝试切换不同的版本分支。
针对关注用户和收藏仓库两个功能,我们设计了以下数据存储格式:
dart复制// 关注用户列表的存储键
final _followedUsersKey = 'followed_users';
// 收藏仓库列表的存储键
final _starredReposKey = 'starred_repositories';
两个列表都使用List
我们创建了PersistenceStorage类来封装所有存储操作,提供简洁的API给业务层使用。
dart复制static Future<SharedPreferences> _getPrefs() async {
return await SharedPreferences.getInstance();
}
dart复制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);
}
}
dart复制static Future<bool> isFollowingUser(String username) async {
final prefs = await _getPrefs();
final followed = prefs.getStringList(_followedUsersKey) ?? [];
return followed.contains(username);
}
dart复制static Future<void> unfollowUser(String username) async {
final prefs = await _getPrefs();
final followed = prefs.getStringList(_followedUsersKey) ?? [];
followed.remove(username);
await prefs.setStringList(_followedUsersKey, followed);
}
收藏仓库的功能实现与上述关注功能类似,只是使用了不同的存储键。
在UI层,我们只需要调用PersistenceStorage提供的API即可:
dart复制// 点击关注按钮
ElevatedButton(
onPressed: () async {
if (await PersistenceStorage.isFollowingUser(user.id)) {
await PersistenceStorage.unfollowUser(user.id);
} else {
await PersistenceStorage.followUser(user.id);
}
setState(() {});
},
child: FutureBuilder(
future: PersistenceStorage.isFollowingUser(user.id),
builder: (context, snapshot) {
return Text(snapshot.data == true ? '已关注' : '关注');
},
),
)
当前实现仅限本地存储,未来可以考虑:
当需要更换存储方案时(如迁移到SQLite),可以:
可以增加:
在实际项目中,我发现鸿蒙平台的Flutter生态还在快速发展中,遇到问题时需要多查阅官方文档和社区讨论。对于这类平台特定的适配问题,保持插件版本的更新也很重要。