HarmonyOS Next如何基于HMRouter实现页面重开数据恢复?

当页面关闭时,之前浏览的相关记录依然存在,典型的场景例如短视频评论,当用户打开评论区页进行翻阅后停留在某处,此时关闭评论区再打开,评论内容会任然停留在上一次浏览的位置,这种如何基于HMRouter实现?
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 730
avatarAI BotBETA
在HarmonyOS Next中,基于HMRouter实现页面重开数据恢复,可以通过以下步骤实现:

1. **页面状态保存**:
   - 在页面关闭或进入后台时,利用页面的生命周期方法(如`onPause`或`onDestroy`)保存当前页面的状态信息,比如用户浏览到的评论位置。
   - 可以使用全局状态管理、本地存储(如`Preferences`)或内存缓存等方式来保存这些信息。

2. **路由参数传递**:
   - 在定义路由时,为需要恢复状态的页面添加必要的参数,用于接收之前保存的状态信息。
   - 使用HMRouter的路由跳转功能时,将状态信息作为参数传递给目标页面。

3. **页面状态恢复**:
   - 在页面打开或从前台恢复时,利用页面的生命周期方法(如`onCreate`或`onResume`)检查路由参数中是否包含状态信息。
   - 如果包含状态信息,则根据这些信息恢复页面的状态,比如滚动到用户之前浏览到的评论位置。

4. **实现细节**:
   - 对于短视频评论的场景,可以在用户滚动评论列表时监听滚动事件,实时更新保存的状态信息。
   - 在页面跳转时,通过HMRouter的API将状态信息作为参数传递给评论区页面。
   - 评论区页面在打开时,从路由参数中读取状态信息,并据此恢复评论列表的滚动位置。

通过以上步骤,可以在HarmonyOS Next中基于HMRouter实现页面重开数据恢复的功能,从而提升用户体验。
1 个回答
//使用[BuilderNode](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-user-defined-arktsnode-buildernode-V5)构造出评论区组件,在makeNode函数中,若评论区不存在则创建,存在便直接返回。
@Builder
function buildComment(liveComments: LiveCommentsProduct[]) {
  // ...
}



export class CommentNodeController extends NodeController {
  commentArea: BuilderNode<[LiveCommentsProduct[]]> | null = null;
  commentListData: LiveCommentsProduct[] = new LiveCommentsModel().getLiveCommentsList()

  constructor() {
    super();
  }

  makeNode(context: UIContext): FrameNode | null {
    if (this.commentArea == null) {
      this.nodeBuild(context)
    }
    return this.commentArea!.getFrameNode();
  }

  nodeBuild(context: UIContext) {
    this.commentArea = new BuilderNode(context);
    if (this.commentArea !== null) {
      this.commentArea.build(wrapBuilder<[LiveCommentsProduct[]]>(buildComment), this.commentListData)
    }
  }

  dispose() {
    if (this.commentArea !== null) {
      this.commentArea.dispose();
    }
  }
}
//通过在@HMLifecycle生命周期中,将CommentNodeController类的实例跟随视频播放页面的生命周期创建与释放,而非跟随评论区组件的生命周期创建与释放,使得当用户处在视频播放页时,内存中保存着评论区组件的BuilderNode,从而达成当用户关闭评论区再打开,浏览进度与关闭前一致的诉求。
@HMLifecycle({ lifecycleName: 'liveHomeLifecycle' })
export class liveHomeLifecycle implements IHMLifecycle {
  // ...
  commentRenderNode: CommentNodeController = new CommentNodeController();

  onAppear(ctx: HMLifecycleContext): void {
    this.commentRenderNode.makeNode(ctx.uiContext);
  }

  onDisAppear(ctx: HMLifecycleContext): void {
    this.commentRenderNode.dispose();
  }

  // ...
}
//在对应的UI组件处获取到生命周期内的commentRenderNode,并在后续业务逻辑中使用NodeContainer进行挂载。
@Component
export struct CommentInput {
  @State commentRenderNode: CommentNodeController =
    (HMRouterMgr.getCurrentLifecycle() as liveHomeLifecycle).commentRenderNode;

  // ...
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进