HarmonyOS 鸿蒙Next:多个Entry页面中同步数据,只使用@StorageLink可以嘛?

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:多个Entry页面中同步数据,只使用@StorageLink可以嘛?

看了文档@Provide@Consume只支持在父子页面实现数据双向同步,不支持在两个或者多个@Entry中实现数据同步。

所以想到了@StorageLink,看文档中说 @StorageLink(key)是和AppStorage中key对应的属性建立双向数据同步,但是在我使用的过程中没有使用AppStorage来搭配使用也可以实现数据双向同步,这样合理嘛?

----------------------------------

cke_4736.png

----------------------------------

第一个页面

cke_15506.png

跳转目标页:跳转过来后可以获取到 - 上个页面读取到的页面栈内的页面数量为一

cke_18865.png

8 回复
文档说:[@StorageProp](/user/StorageProp)和[@StorageLink](/user/StorageLink)都需要本地初始化,就是为了避免AppStorage没有先声明对应key的属性时,可用这两个装饰器指定的初始值在AS中创建一个属性;所以不先用AS声明理论上是可行的,只要两个装饰器之一声明了变量就自动在AS数据库中创建了。
好问题,就目前情况来看,系统对于[@StorageProp](/user/StorageProp)和[@StorageLink](/user/StorageLink)装饰的变量自动在AppStorage中完成了创建,无需再手动在AppStorage中设置一遍。

今天遇到一个问题:

在一个点击事件中保存了一个值

 AppStorage.setOrCreate('viewFoldBtn', this.viewFoldBtn)<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

在其他页面先判断这个值是否符合绘制条件,如果符合则正常绘制

问题出现在,第一次进入app时,不会触发绘制,只有出发点击事件后才显示出绘制的内容

解决办法就是在全局,即点击事件外,声明个初始值为空的 viewFoldBtn

​
AppStorage.setOrCreate('viewFoldBtn', [])<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

在build函数后用[@storagelink](/user/storagelink)创建一下

[@StorageLink](/user/StorageLink)("storageFoldBtn") storageFoldBtn: boolean[] = []<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
也可以用单例模式共享数据

请问有文档可以参考嘛

单例这个很简单,就是每次通过静态类获取实例都是同一个,以此达到共享数据的目的

我发现前后台之间交互,如果大量多个页面或者组件使用后台对象或者变量时,基本都是用[@StorageLink](/user/StorageLink)注解去同步的,是很好用,但是我用的也很多,不清楚这样是否规范,但是确实很好用。不用组件间来回传递参数了

在HarmonyOS中,@StorageLink 是一种便捷的数据持久化和跨页面同步机制,它主要设计用于在单个应用内,自动将存储在全局状态管理(如全局变量)中的数据与本地存储(如SQLite、Preference等)进行同步,并能够在组件(如Page、Custom Component等)之间实现数据的自动更新。

对于多个Entry页面间的数据同步,如果这些数据是全局性的且频繁访问,使用@StorageLink可以简化数据持久化和同步的复杂性。但需要注意的是,@StorageLink主要关注于数据的持久化和自动更新,并不直接管理页面间的通信逻辑。

如果你的多个Entry页面需要频繁且实时地共享数据,并且这些数据的同步是全局的,那么@StorageLink是一个不错的选择。然而,如果数据同步还涉及到复杂的业务逻辑或需要跨页面调用特定方法,你可能还需要结合使用全局状态管理(如Global State Management、Event Bus等)来辅助实现。

如果问题依旧没法解决,建议查看HarmonyOS的官方文档或示例代码,以获取更多关于@StorageLink和全局状态管理的信息。如果仍无法解决,请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部