ToB企服应用市场:ToB评测及商务社交产业平台

标题: 鸿蒙NEXT开发ArkUI【ComponentContent】 UI界面 [打印本页]

作者: 守听    时间: 2025-1-2 00:56
标题: 鸿蒙NEXT开发ArkUI【ComponentContent】 UI界面
ComponentContent表示组件内容的实体封装,其对象支持在非UI组件中创建与通报,便于开发者对弹窗类组件举行解耦封装。ComponentContent底层使用了BuilderNode
阐明
本模块从API version 12开始支持。后续版本的新增接口,采用上角标单独标志接口的起始版本。
当前不支持在预览器中使用ComponentContent。
导入模块

  1. import { ComponentContent } from '@kit.ArkUI';
复制代码
ComponentContent

constructor

constructor(uiContext: UIContext, builder: WrappedBuilder<[]>)
ComponentContent的构造函数。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填阐明uiContext[UIContext]是创建对应节点时候所需要的UI上下文。builder[WrappedBuilder<[]>]是封装不带参builder函数的WrappedBuilder对象。 constructor

constructor(uiContext: UIContext, builder: WrappedBuilder<[T]>, args: T)
ComponentContent的构造函数。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填阐明uiContext[UIContext]是创建对应节点时候所需要的UI上下文。builder[WrappedBuilder<[T]>]是封装带参builder函数的WrappedBuilder对象。argsT是WrappedBuilder对象封装的builder函数的参数。 constructor

constructor(uiContext: UIContext, builder: WrappedBuilder<[T]>, args: T, options: BuildOptions)
ComponentContent的构造函数。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填阐明uiContext[UIContext]是创建对应节点时候所需要的UI上下文。builder[WrappedBuilder<[T]>]是封装带参builder函数的WrappedBuilder对象。argsT是WrappedBuilder对象封装的builder函数的参数。options[BuildOptions]是build的配置参数,判断是否支持@Builder中嵌套@Builder的行为。 示例:
  1. import { ComponentContent, NodeContent, typeNode } from "@kit.ArkUI"
  2. interface ParamsInterface {
  3.   text: string;
  4.   func: Function;
  5. }
  6. @Builder
  7. function buildTextWithFunc(fun: Function) {
  8.   Text(fun())
  9.     .fontSize(50)
  10.     .fontWeight(FontWeight.Bold)
  11.     .margin({ bottom: 36 })
  12. }
  13. @Builder
  14. function buildText(params: ParamsInterface) {
  15.   Column() {
  16.     Text(params.text)
  17.       .fontSize(50)
  18.       .fontWeight(FontWeight.Bold)
  19.       .margin({ bottom: 36 })
  20.     buildTextWithFunc(params.func)
  21.   }
  22. }
  23. @Entry
  24. @Component
  25. struct Index {
  26.   @State message: string = "HELLO"
  27.   private content: NodeContent = new NodeContent();
  28.   build() {
  29.     Row() {
  30.       Column() {
  31.         Button('addComponentContent')
  32.           .onClick(() => {
  33.             let column = typeNode.createNode(this.getUIContext(), "Column");
  34.             column.initialize();
  35.             column.addComponentContent(new ComponentContent<ParamsInterface>(this.getUIContext(),
  36.               wrapBuilder<[ParamsInterface]>(buildText), {
  37.                 text: this.message, func: () => {
  38.                   return "FUNCTION"
  39.                 }
  40.               }, { nestingBuilderSupported: true }))
  41.             this.content.addFrameNode(column);
  42.           })
  43.         ContentSlot(this.content)
  44.       }
  45.       .id("column")
  46.       .width('100%')
  47.       .height('100%')
  48.     }
  49.     .height('100%')
  50.   }
  51. }
复制代码
update

update(args: T): void
用于更新WrappedBuilder对象封装的builder函数参数,与constructor传入的参数类型保持同等。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填阐明argsT是用于更新WrappedBuilder对象封装的builder函数参数,与constructor传入的参数类型保持同等。 示例:
  1. import { ComponentContent } from "@kit.ArkUI";
  2. class Params {
  3.   text: string = ""
  4.   constructor(text: string) {
  5.     this.text = text;
  6.   }
  7. }
  8. @Builder
  9. function buildText(params: Params) {
  10.   Column() {
  11.     Text(params.text)
  12.       .fontSize(50)
  13.       .fontWeight(FontWeight.Bold)
  14.       .margin({bottom: 36})
  15.   }.backgroundColor('#FFF0F0F0')
  16. }
  17. @Entry
  18. @Component
  19. struct Index {
  20.   @State message: string = "hello"
  21.   build() {
  22.     Row() {
  23.       Column() {
  24.         Button("click me")
  25.             .onClick(() => {
  26.                 let uiContext = this.getUIContext();
  27.                 let promptAction = uiContext.getPromptAction();
  28.                 let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), new Params(this.message));
  29.                 promptAction.openCustomDialog(contentNode);
  30.                 setTimeout(() => {
  31.                   contentNode.update(new Params("new message"));
  32.                 }, 2000);    //2秒后自动更新弹窗内容文本
  33.             })
  34.       }
  35.       .width('100%')
  36.       .height('100%')
  37.     }
  38.     .height('100%')
  39.   }
  40. }
复制代码
reuse

reuse(param?: Object): void
通报reuse事件到ComponentContent中的自界说组件。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填阐明paramObject否用于复用WrappedBuilder对象封装的builder函数参数,与constructor传入的参数类型保持同等。 recycle

recycle(): void
通报recycle事件到ComponentContent中的自界说组件。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
  1. import { ComponentContent } from '@kit.ArkUI';
  2. class Params {  text: string = ""  constructor(text: string) {    this.text = text;  }}@Builderfunction buildText(params: Params) {  ReusableChildComponent2({ text: params.text });}@Componentstruct ReusableChildComponent2 {  @Prop text: string = "false";  aboutToReuse(params: Record<string, object>) {    console.log("ReusableChildComponent2 Reusable " + JSON.stringify(params));  }  aboutToRecycle(): void {    console.log("ReusableChildComponent2 aboutToRecycle " + this.text);  }  build() {    Column() {      Text(this.text)        .fontSize(50)        .fontWeight(FontWeight.Bold)        .margin({ bottom: 36 })    }.backgroundColor('#FFF0F0F0')  }}@Entry@Componentstruct Index {  @State message: string = "hello"  build() {    Row() {      Column() {        Button("click me")          .onClick(() => {            let uiContext = this.getUIContext();            let promptAction = uiContext.getPromptAction();            let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), new Params(this.message));            promptAction.openCustomDialog(contentNode);            setTimeout(() => {              contentNode.reuse(new Params("new message"));              contentNode.recycle();            }, 2000); //2秒后自动更新弹窗内容文本          })      }      .width('100%')      .height('100%')    }    .height('100%')  }}
复制代码
dispose

dispose(): void
立即开释当前ComponentContent,即ComponentContent对象与后端实体节点排除引用关系。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
示例:
  1. import { BusinessError } from '@kit.BasicServicesKit';import { ComponentContent } from '@kit.ArkUI';
  2. class Params {  text: string = ""  constructor(text: string) {    this.text = text;  }}@Builderfunction buildText(params: Params) {  Column() {    Text(params.text)      .fontSize(50)      .fontWeight(FontWeight.Bold)      .margin({bottom: 36})  }.backgroundColor('#FFF0F0F0')}@Entry@Componentstruct Index {  @State message: string = "hello"  build() {    Row() {      Column() {        Button("click me")            .onClick(() => {                let uiContext = this.getUIContext();                let promptAction = uiContext.getPromptAction();                let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), new Params(this.message));                promptAction.openCustomDialog(contentNode);                setTimeout(() => {                  promptAction.closeCustomDialog(contentNode)                    .then(() => {                      console.info('customdialog closed.')                      if (contentNode !== null) {                        contentNode.dispose();   //开释contentNode                      }                    }).catch((error: BusinessError) => {                      let message = (error as BusinessError).message;                      let code = (error as BusinessError).code;                      console.error(`closeCustomDialog args error code is ${code}, message is ${message}`);                    })                }, 2000);     //2秒后自动关闭            })      }      .width('100%')      .height('100%')    }    .height('100%')  }}
复制代码
updateConfiguration

updateConfiguration(): void
通报[系统环境变化]事件,触发节点的全量更新。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统能力:  SystemCapability.ArkUI.ArkUI.Full
阐明
updateConfiguration接口功能为通知对象更新,更新所使用的系统环境由当前的系统环境变化。
示例:
  1. import { NodeController, FrameNode, ComponentContent, typeNode } from '@kit.ArkUI';
  2. import { AbilityConstant, Configuration, EnvironmentCallback } from '@kit.AbilityKit';
  3. @Builder
  4. function buildText() {
  5.   Column() {
  6.     Text('hello')
  7.       .width(50)
  8.       .height(50)
  9.       .fontColor($r(`app.color.text_color`))
  10.   }.backgroundColor($r(`app.color.start_window_background`))
  11. }
  12. const componentContentMap: Array<ComponentContent<[Object]>> = new Array();
  13. class MyNodeController extends NodeController {
  14.   private rootNode: FrameNode | null = null;
  15.   makeNode(uiContext: UIContext): FrameNode | null {
  16.     return this.rootNode;
  17.   }
  18.   createNode(context: UIContext) {
  19.     this.rootNode = new FrameNode(context);
  20.     let component = new ComponentContent<Object>(context, wrapBuilder(buildText));
  21.     componentContentMap.push(component);
  22.     this.rootNode.addComponentContent(component);
  23.   }
  24.   deleteNode() {
  25.     let node = componentContentMap.pop();
  26.     this.rootNode?.dispose();
  27.     node?.dispose();
  28.   }
  29. }
  30. function updateColorMode() {
  31.   componentContentMap.forEach((value, index) => {
  32.     value.updateConfiguration();
  33.   })
  34. }
  35. @Entry
  36. @Component
  37. struct FrameNodeTypeTest {
  38.   private myNodeController: MyNodeController = new MyNodeController();
  39.   aboutToAppear(): void {
  40.     let environmentCallback: EnvironmentCallback = {
  41.       onMemoryLevel: (level: AbilityConstant.MemoryLevel): void => {
  42.         console.log('onMemoryLevel');
  43.       },
  44.       onConfigurationUpdated: (config: Configuration): void => {
  45.         console.log('onConfigurationUpdated ' + JSON.stringify(config));
  46.         updateColorMode();
  47.       }
  48.     }
  49.     // 注册监听回调
  50.     this.getUIContext().getHostContext()?.getApplicationContext().on('environment', environmentCallback);
  51.     this.myNodeController.createNode(this.getUIContext());
  52.   }
  53.   aboutToDisappear(): void {
  54.     //移除map中的引用,并将自定义节点释放
  55.     this.myNodeController.deleteNode();
  56.   }
  57.   build() {
  58.     Row() {
  59.       NodeContainer(this.myNodeController);
  60.     }
  61.   }
  62. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4