可以介绍下HarmonyOS Next中NodeController的声明周期吗?

阅读 625
avatarAI BotBETA

在HarmonyOS Next中,NodeController的声明周期主要包括以下几个关键阶段:

  1. 创建与绑定

    • NodeController被创建,并与一个NodeContainer进行绑定。这一步骤通常在应用的初始化阶段完成。
  2. makeNode回调

    • 当NodeController绑定的NodeContainer创建时,会触发makeNode回调方法。此方法用于返回一个节点,该节点将被挂载到NodeContainer上。
  3. aboutToAppear

    • 当NodeController绑定的NodeContainer挂载显示时,会触发aboutToAppear回调。这标志着NodeController管理的节点即将出现在UI中。
  4. 交互事件处理

    • 在NodeController的生命周期中,可能会接收到各种交互事件,如触摸事件(通过onTouchEvent回调处理)。这些事件允许NodeController对用户的交互做出响应。
  5. aboutToResize

    • 当NodeController绑定的NodeContainer的布局发生变化时,会触发aboutToResize回调。这允许NodeController根据新的布局尺寸调整节点的显示。
  6. aboutToDisappear

    • 当NodeController绑定的NodeContainer卸载消失时,会触发aboutToDisappear回调。这标志着NodeController管理的节点即将从UI中移除。
  7. 销毁与解绑

    • 在NodeController的生命周期结束时,它将与NodeContainer解绑,并可能进行销毁操作。尽管具体的销毁逻辑可能因实现而异,但通常涉及清理资源和释放内存。

以下是一个使用NodeController管理节点生命周期的示例代码片段(使用TypeScript语法):

import { NodeController, BuilderNode, Size, FrameNode, UIContext } from '@ohos.arkui.node';
import { wrapBuilder, WrappedBuilder } from '@ohos.arkui.builder';

class Params {
  text: string = "this is a text";
}

@Builder
function buttonBuilder(params: Params) {
  Column() {
    Button(params.text)
      .fontSize(12)
      .borderRadius(8)
      .borderWidth(2)
      .backgroundColor(Color.Orange)
  }
}

class MyNodeController extends NodeController {
  private buttonNode: BuilderNode<[Params]> | null = null;
  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);

  makeNode(uiContext: UIContext): FrameNode {
    if (this.buttonNode == null) {
      this.buttonNode = newBuilderNode(uiContext);
      this.buttonNode.build(this.wrapBuilder, { text: "This is a Button" });
    }
    return this.buttonNode!.getFrameNode()!;
  }

  aboutToResize(size: Size) {
    console.log("aboutToResize width : " + size.width + " height : " + size.height);
  }

  aboutToAppear() {
    console.log("aboutToAppear");
  }

  aboutToDisappear() {
    console.log("aboutToDisappear");
  }

  onTouchEvent(event: TouchEvent) {
    console.log("onTouchEvent");
  }
}

@Entry
@Component
struct Index {
  private myNodeController: MyNodeController = new MyNodeController();

  build() {
    Column() {
      NodeContainer(this.myNodeController)
        .padding({ left: 35, right: 35, top: 35 })
        .width("100%")
        .height("100%");
    }
  }
}

在这个示例中,MyNodeController类扩展了NodeController,并实现了makeNodeaboutToResizeaboutToAppearaboutToDisappearonTouchEvent回调方法。这些方法分别处理节点的创建、布局调整、显示、隐藏和触摸事件。Index结构体则使用NodeContainer组件来展示由MyNodeController管理的节点。

1 个回答

NodeController用于控制和反馈对应的NodeContainer上的节点的行为,需要与NodeContainer一起使用。下面,对其常用生命周期函数进行说明。

  • makeNode必须要重写的方法,用于构建节点树、返回节点挂载在对应NodeContainer中。在对应NodeContainer创建绑定当前NodeController的时候调用、或者通过rebuild方法调用刷新。
  • aboutToResize当controller对应的NodeContainer在Mesure的时候进行回调,入参为节点的布局大小。
  • aboutToAppear当controller对应的NodeContainer在onAppear的时候进行回调。
  • aboutToDisappear当controller对应的NodeContainer在onDisappear的时候进行回调。

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

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