ArkUI开发框架里的自定义组件内置方法,这些可是应用开发者的超级帮手,能让你轻松获取组件实例的各种信息,比如上下文、唯一ID啥的。文档里介绍了几个关键方法,我会用大白话总结每个的重点,配上实际代码示例,让你一看就懂。
1. getUIContext() 方法
重点总结: 这个方法超级实用,它能帮你拿到当前组件的UIContext对象,简单说就是组件的“环境信息”,比如屏幕尺寸、主题设置等。你可以在组件的生命周期里调用它,比如在aboutToAppear函数中。它支持Phone、PC、平板等设备,从API 12起还能在元服务里用。返回值直接是个UIContext实例,用起来超方便。下面代码里,我在MyComponent的aboutToAppear里调用了它,把UIContext存到变量里,后续就能用来干各种事,比如调整UI布局。
代码示例:
import { UIContext } from '@kit.ArkUI';
@Entry
@Component
struct MyComponent {
aboutToAppear() {
let uiContext: UIContext = this.getUIContext(); // 获取UIContext对象
// 现在可以用uiContext做操作了,比如查询设备信息
}
build() {
// 构建UI的代码放这里
Column() {
Text('Hello, ArkUI!')
}
}
}2. getUniqueId() 方法
重点总结: 这个方法专治“组件身份识别”问题!它能返回当前组件的UniqueId,也就是系统分配的独一无二的ID,保证整个应用里不重复。超有用在调试或跟踪组件状态时。注意:如果组件节点还没创建或已销毁,它会返回-1(无效ID)。支持设备同上,从API 12起元服务也能用。返回值是个数字,直接拿来用就行。代码里,我在aboutToAppear里调用它,把ID存起来,方便后续日志输出或状态管理。
代码示例:
@Entry
@Component
struct MyComponent {
aboutToAppear() {
let uniqueId: number = this.getUniqueId(); // 获取组件的UniqueId
console.log('My Unique ID is: ' + uniqueId); // 输出到控制台
}
build() {
// 构建UI
Column() {
Button('Click Me')
}
}
}3. queryNavDestinationInfo() 方法(无参数版本)
重点总结: 这个方法帮你查导航信息,特别适合用在NavDestination组件里。它能返回NavDestinationInfo对象,包含导航目标的详情,比如页面名称。但有个前提:你的自定义组件必须在NavDestination内部才生效,否则返回undefined。从API 12起支持元服务。返回值是NavDestinationInfo或undefined,记得检查空值。代码示例中,我在MyComponent的aboutToAppear里调用它,向上查找最近的NavDestination父节点,并把信息打印出来,超适合做页面路由跟踪。
代码示例:
import { uiObserver } from '@kit.ArkUI';
@Component
export struct NavDestinationExample {
build() {
NavDestination() {
MyComponent() // 自定义组件在NavDestination内部
}
}
}
@Component
struct MyComponent {
navDesInfo: uiObserver.NavDestinationInfo | undefined;
aboutToAppear() {
this.navDesInfo = this.queryNavDestinationInfo(); // 查询NavDestination信息
console.log('NavDestination Info: ' + JSON.stringify(this.navDesInfo));
}
build() {
Column() {
Text('Check Nav Info')
}
}
}4. queryNavDestinationInfo(isInner: Optional<boolean>) 方法(有参数版本)
重点总结: 这是上个方法的升级版,从API 18开始,加了isInner参数,让你更灵活地查导航栈。参数isInner是必填的boolean:true表示“向内”查最近的NavDestination(在栈内),false表示“向外”查。同样,只在组件在NavDestination内有效,支持元服务。返回值还是NavDestinationInfo或undefined。代码里展示了完整场景:在PageOneComponent中,按钮点击时根据isInner值查询导航信息,并更新UI显示。这方法超适合动态路由应用,比如单页面App的导航控制。
代码示例:
// PageOne.ets
import { uiObserver } from '@kit.ArkUI';
@Builder
export function PageOneBuilder() {
PageOneComponent()
}
@Component
export struct PageOneComponent {
navDesInfo: uiObserver.NavDestinationInfo | undefined;
@State text: string = '';
build() {
NavDestination() {
Column() {
Button('点击向内查找')
.onClick(() => {
this.navDesInfo = this.queryNavDestinationInfo(true); // 向内查询
this.text = JSON.stringify(this.navDesInfo?.name).toString();
})
Text('向内查找的NavDestination是:' + this.text)
MyComponent()
}
}
.title('pageOne')
}
}
@Component
struct MyComponent {
navDesInfo: uiObserver.NavDestinationInfo | undefined;
@State text: string = '';
build() {
Column() {
Button('点击向外查找')
.onClick(() => {
this.navDesInfo = this.queryNavDestinationInfo(false); // 向外查询
this.text = JSON.stringify(this.navDesInfo?.name).toString();
})
Text('向外查找的NavDestination是:' + this.text)
}
}
}
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/PageOne.ets",
"buildFunction": "PageOneBuilder",
"data": { "description": "this is pageOne" }
}
]
}5. queryNavigationInfo() 方法
重点总结: 这个方法聚焦在Navigation组件上,能返回NavigationInfo对象,包含整个导航栈的信息,比如路径堆栈。它要求组件在Navigation内部调用,否则返回undefined。从API 12起支持元服务。返回值是NavigationInfo或undefined,适合用在页面初始化时获取导航状态。代码示例里,我在PageOne组件的aboutToAppear里调用它,向上查Navigation父节点,并更新路径堆栈。这招在管理多级导航时超省心,比如电商App的页面跳转。
代码示例:
// index.ets
import { uiObserver } from '@kit.ArkUI';
@Entry
@Component
struct MainPage {
pathStack: NavPathStack = new NavPathStack();
build() {
Navigation(this.pathStack) {
// 导航内容
}
.id("NavigationId")
}
}
@Component
export struct PageOne {
pathStack: NavPathStack = new NavPathStack();
aboutToAppear() {
let navigationInfo: uiObserver.NavigationInfo | undefined = this.queryNavigationInfo(); // 查询Navigation信息
console.log('Navigation Info: ' + JSON.stringify(navigationInfo));
if (navigationInfo != undefined) {
this.pathStack = navigationInfo.pathStack; // 更新路径堆栈
}
}
build() {
NavDestination() {
Column() {
Text('Navigation Page')
}
}
.title('PageOne')
}
}6. queryRouterPageInfo() 方法
重点总结: 这个方法专攻路由页面信息,返回RouterPageInfo对象,包含页面源文件、构建函数等细节。从API 12起支持元服务,返回值是RouterPageInfo或undefined。调用时机最好在组件生命周期早期,比如aboutToAppear。它帮你动态获取页面配置,不用硬编码。代码里,我在MyComponent初始化时调用它,把信息存起来,后续可用于日志或路由优化。这在大型应用中超实用,比如根据页面信息加载不同资源。
代码示例:
import { uiObserver } from '@kit.ArkUI';
@Entry
@Component
struct MyComponent {
aboutToAppear() {
let info: uiObserver.RouterPageInfo | undefined = this.queryRouterPageInfo(); // 获取路由页面信息
if (info) {
console.log('Page Source: ' + info.pageSourceFile);
}
}
build() {
Column() {
Button('Get Page Info')
}
}
}7. getDialogController() 方法
重点总结: 这个方法处理自定义弹窗控制,返回PromptActionDialogController对象,让你能关弹窗或管理状态。从API 18开始,支持元服务。返回值是PromptActionDialogController或undefined,记得检查空值。它常和弹窗组件配合使用,比如在按钮点击事件里调用。代码示例展示了完整流程:在MyComponent里,按钮点击时获取控制器并关弹窗;在Index里,用openCustomDialog打开弹窗。这方法让弹窗交互变得超灵活,适合表单确认或消息提示。
代码示例:
import { BusinessError } from '@kit.BasicServicesKit';
import { ComponentContent } from '@kit.ArkUI';
class Params {
text: string = "";
constructor(text: string) {
this.text = text;
}
}
@ComponentV2
struct MyComponent {
build() {
Column() {
Button('Close Dialog')
.onClick(() => {
let ctrl: PromptActionDialogController | undefined = this.getDialogController(); // 获取弹窗控制器
if (ctrl != undefined) {
ctrl.close(); // 关闭弹窗
}
})
}
}
}
@Builder
function buildText(params: Params) {
Column() {
Text(params.text)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 36 })
MyComponent()
}
.backgroundColor('#FFF0F0F0')
}
@Entry
@ComponentV2
struct Index {
@Local message: string = "hello";
build() {
Row() {
Column({ space: 10 }) {
Button('click me')
.fontSize(20)
.onClick(() => {
let ctx = this.getUIContext();
let promptAction = ctx.getPromptAction();
promptAction.openCustomDialog(new ComponentContent(ctx, wrapBuilder(buildText), new Params(this.message)))
.catch((err: BusinessError) => {
console.error("openCustomDialog error: " + err.code + " " + err.message);
})
})
}
.width('100%')
.height('100%')
}
.height('100%')
}
}总结一下
这些自定义组件内置方法真是开发利器!getUIContext帮你拿环境信息,getUniqueId确保组件唯一性,queryNavDestinationInfo和queryNavigationInfo处理导航细节,queryRouterPageInfo管理路由,getDialogController控制弹窗。每个都带代码示例,上手超快。记住,从API 11起支持,新功能在后续版本添加。多用这些方法,你的ArkUI应用会更高效、更稳定。
