HarmonyOS鸿蒙Next中Preferences.putSync不能跨设备还是别的问题,鸿蒙会有投屏不会同步存储信息的问题?

HarmonyOS鸿蒙Next中Preferences.putSync不能跨设备还是别的问题,鸿蒙会有投屏不会同步存储信息的问题? 【问题描述】:

app做了个首次弹框的功能,技术实现是通Preferences.putSync(‘isFirstLaunch’, ‘false’) 改变弹框状态值,弹框的显示隐藏用这个值的true false去判断的,目前有问题是 单纯app 是可以正常的跑的,但是有用户反馈 当手机投屏到平板上的时候 app之前已经取消了弹框 但是到了平板上还会有

Preferences.putSync 是不是不能跨设备还是别的问题 鸿蒙会有投屏不会同步存储信息的问题?

【版本信息】:开发工具 5.0.5 Release 系统版本 6.0.0 Api语言 5.0.2(14)

使用的是手机应用自由流转到了平板上


更多关于HarmonyOS鸿蒙Next中Preferences.putSync不能跨设备还是别的问题,鸿蒙会有投屏不会同步存储信息的问题?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

【解决方案】

Preferences用户首选项持久化文件存储在preferencesDir路径下,首选项的持久化文件保存在应用沙箱内部,不同设备上相同应用的沙箱是独立的。

HarmonyOS提供了跨设备数据同步功能(即分布式功能)指将数据库中的数据同步到组网环境中的其他设备。该功能常用于在可信认证的不同设备间自由同步、修改和查询用户应用程序数据。

更多关于HarmonyOS鸿蒙Next中Preferences.putSync不能跨设备还是别的问题,鸿蒙会有投屏不会同步存储信息的问题?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


另外你看下 你存储之后有么有preferences.flush()

总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!

Preferences.putSync是在当前设备的存储状态,手机投屏到平板,平板弹窗没有关闭,你看看是不是你的状态没更新,不是存储状态的问题

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

Preferences.putSync是不能跨设备的吧?

对啊 ,投屏是根据你手机状态走的,手机没有弹窗,平板正常是没有的,

如果是自由流转到平板的上的应用 , 就是跨端 ,不能使用Preferences.putSync吧老师,

Preferences.putSync方法在HarmonyOS Next中不支持跨设备数据同步。该API仅用于本地设备的数据存储。跨设备数据同步需要使用分布式数据管理服务,如分布式数据对象或分布式数据库。投屏功能本身不包含数据同步机制,因此不会自动同步存储信息。

这是一个典型的对分布式数据管理机制理解不准确导致的问题。

核心结论:Preferences.putSync 存储的数据是设备本地的,无法通过投屏(自由流转)自动同步到另一台设备。

详细解释:

  1. Preferences 的数据范围Preferences设备本地 的轻量级键值对存储。它存储的数据作用域仅限于当前设备的当前应用。调用 putSync('isFirstLaunch', 'false') 后,这个 false 值只会保存在当前手机的存储中

  2. 投屏/自由流转的本质:当手机应用流转到平板时,平板上运行的是手机应用的一个远程界面实例,或者是一个协同的跨端应用。这个过程中,应用的进程和数据并没有从手机“迁移”到平板。平板上的界面展示依赖于手机端的应用状态和逻辑。

  3. 问题根源:你的弹框显示逻辑依赖于本地的 Preferences 值。在手机上,用户操作后,isFirstLaunch 在手机的本地存储中被置为 false,手机端应用不再弹框。但当流转到平板时,平板端应用(或界面)会尝试读取它自身设备(即平板)上的 Preferences。由于这是平板上该应用的首次运行(或从未在此设备上执行过 putSync('isFirstLaunch', 'false')),平板本地存储中 isFirstLaunch 的值很可能为默认值(或 true),因此触发了弹框。

解决方案方向:

要实现跨设备一致的体验,不能使用设备本地的 Preferences,而需要使用 分布式数据管理

  • 使用分布式数据对象 DistributedObject:这是 HarmonyOS 为跨设备数据同步提供的核心能力。你可以创建一个分布式数据对象来管理 isFirstLaunch 这个状态。
    • 在手机端应用中将状态改为 false 时,通过分布式数据对象进行设置。
    • 平板端的应用监听这个分布式数据对象的变化。当流转发生时,平板端读取到的是手机端已经更新过的共享状态(false),从而不会触发弹框。
  • 关键步骤
    1. 创建或获取一个 KVManager 实例。
    2. 创建一个 DistributedObject,并为其定义一个唯一的 sessionId,确保多设备间能访问同一个数据对象。
    3. isFirstLaunch 状态存储在这个 DistributedObject 中(例如,使用 set 方法)。
    4. 在所有设备(手机、平板)的应用中,都监听这个 DistributedObject 的数据变化(监听 'change' 事件),并基于最新的共享状态来控制UI(如弹框的显示/隐藏)。

总结

你遇到的现象不是 Bug,而是设计如此。Preferences 用于设备内数据持久化,不具备跨设备同步能力。投屏/自由流转场景下需要状态同步,必须改用 分布式数据对象 (DistributedObject) 或其它跨设备数据同步方案(如分布式数据服务)。你需要重构这部分状态管理的代码,从本地存储切换到分布式数据管理。

回到顶部