NodeController

The NodeController module provides APIs for managing custom nodes, such as creating, showing, and updating custom nodes, and APIs for mounting custom nodes to a <NodeContainer> component.

NOTE

The initial APIs of this module are supported since API version 11. Newly added APIs will be marked with a superscript to indicate their earliest API version.

NodeController is not available in DevEco Studio Previewer.

Modules to Import

import { NodeController } from "@ohos.arkui.node";

NodeController

Implements a NodeController instance to manage the bound <NodeContainer> component. One NodeController instance can be bound to only one <NodeContainer> component.

System capability: SystemCapability.ArkUI.ArkUI.Full

makeNode

abstract makeNode(uiContext : UIContext): FrameNode | null

Called when the <NodeContainer> component bound to this NodeController instance is created. This callback returns a node, which will be mounted to the <NodeContainer>. This callback can also be invoked through the rebuild() method of NodeController.

System capability: SystemCapability.ArkUI.ArkUI.Full

Parameters

Name Type Mandatory Description
uiContext UIContext Yes UI context of the bound <NodeContainer> component.

Return value

Type Description
FrameNode| null FrameNode object, which will be mounted to the placeholder node of the <NodeContainer> component. If a null object is returned, the child nodes of the corresponding <NodeContainer> component are removed.

aboutToAppear

aboutToAppear?(): void

Called when the <NodeContainer> component bound to this NodeController instance is mounted and about to be displayed.

System capability: SystemCapability.ArkUI.ArkUI.Full

aboutToDisappear

aboutToDisappear?(): void

Called when the <NodeContainer> component bound to this NodeController instance is unmounted and about to be hidden.

System capability: SystemCapability.ArkUI.ArkUI.Full

aboutToResize

aboutToResize?(size: Size): void

Called when the <NodeContainer> component bound to this NodeController instance is resized.

System capability: SystemCapability.ArkUI.ArkUI.Full

Parameters

Name Type Mandatory Description
size Size Yes Width and height of the component, in vp.

onTouchEvent

onTouchEvent?(event: TouchEvent): void

Called when the <NodeContainer> component bound to this NodeController instance receives a touch event.

System capability: SystemCapability.ArkUI.ArkUI.Full

Parameters

Name Type Mandatory Description
event TouchEvent Yes Touch event.

rebuild

rebuild(): void

Instructs the <NodeContainer> component bound to this NodeController instance to call the makeNode method again to change child nodes.

System capability: SystemCapability.ArkUI.ArkUI.Full

Example

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

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

@Builder
function buttonBuilder(params: Params) {
  Column() {
    Button(`button ` + params.text)
      .borderWidth(2)
      .backgroundColor(Color.Orange)
  }
}

class MyNodeController extends NodeController {
  private rootNode: FrameNode | null = null;
  private buttonNode: BuilderNode<[Params]> | null = null;
  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
  
  makeNode(uiContext: UIContext): FrameNode {
    if (this.rootNode == null) {
      this.rootNode = new FrameNode(uiContext);
      this.buttonNode = new BuilderNode(uiContext);
      this.buttonNode.build(this.wrapBuilder, { text: "this is a string" })

      const rootRenderNode = this.rootNode.getRenderNode();
      if (rootRenderNode !== null) {
        rootRenderNode.appendChild(this.buttonNode.getFrameNode()?.getRenderNode());
      }
    }
    return this.rootNode;
  }

  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() {
    Row() {
      NodeContainer(this.myNodeController)
    }
  }
}