NodeController用于实现自定义节点的创建、显示、更新等操作的管理,并负责将自定义节点挂载到NodeContainer上。
说明
本模块首批接口从API version 11开始支持
当前不支持在预览器中使用NodeController。
导入模块
import { NodeController } from "@ohos.arkui.node";
NodeController
通常搭配NodeContainer进行使用。用于创建控制器管理绑定的NodeContainer组件。一个NodeController只允许与一个NodeContainer进行绑定。
系统能力: SystemCapability.ArkUI.ArkUI.Full
makeNode
abstract makeNode(uiContext : UIContext): FrameNode | null
当实例绑定的NodeContainer创建的时候进行回调。回调方法将返回一个节点,将该节点挂载至NodeContainer。
或者可以通过NodeController的rebuild()方法进行回调的触发。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
参数名 | 类型 | 必填 | 说明 |
uiContext | UIContext | 是 | 回调该方法时候,绑定NodeContainer的UI上下文。 |
返回值:
类型 | 说明 |
FrameNode| null | 一个FrameNode对象,返回的节点将被挂载至NodeContainer的占位节点上。若返回null对象,将清空对应NodeContainer的子节点。 |
aboutToAppear
aboutToAppear?(): void
当NodeController绑定的NodeContainer挂载显示时触发此回调。
系统能力: SystemCapability.ArkUI.ArkUI.Full
aboutToDisappear
aboutToDisappear?(): void
当NodeController绑定的NodeContainer卸载消失时触发此回调。
系统能力: SystemCapability.ArkUI.ArkUI.Full
aboutToResize
aboutToResize?(size: Size): void
当NodeController绑定的NodeContainer布局的时候触发此回调。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
参数名 | 类型 | 必填 | 说明 |
size | Size | 是 | 用于返回组件布局大小的宽和高,单位为vp。 |
onTouchEvent
onTouchEvent?(event: TouchEvent): void
当NodeController绑定的NodeContainer收到Touch事件时触发此回调。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
参数名 | 类型 | 必填 | 说明 |
event | TouchEvent | 是 | 触摸事件。 |
rebuild
rebuild(): void
调用此接口通知NodeContainer组件重新回调makeNode方法,更改子节点。
系统能力: SystemCapability.ArkUI.ArkUI.Full
示例
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(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 = new BuilderNode(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%")}
}