用户2757534
用户2757534
  • 发布:2025-08-05 21:31
  • 更新:2025-08-12 15:01
  • 阅读:33

各位大佬,uniapp中桥接鸿蒙组件怎么获取UIContext?

分类:鸿蒙Next

HBuilder版本为:3.0.0-4040520250103001
任务目标:在uts中桥接一个原生的鸿蒙弹窗,使用ctx.getPromptAction().openCustomDialog方式唤起,需要在uts文件中把UIContext类型的ctx塞进去。

目前找到的两个方案如下:

  • getAbilityContext() as UIContext:可以编译,点击后报错:napi_call_function failed Error: Node constructor error, param uiContext is invalid

  • getContext() as UIContext:不可编译,报错:Conversion of type 'Context' to type 'UIContext' may be a mistake because neither type sufficiently overlaps with the other. Type 'Context' is missing the following properties from type 'UIContext': getFont, getMediaQuery, getUIInspector, getFilteredInspectorTree, and 56 more

index.uts文件:一个极简的桥接文件

————————————————————————
import { UIContext, promptAction } from '@kit.ArkUI';
import { PromptActionClass } from "./PromptDialog.ets";
import { getAbilityContext } from '@dcloudio/uni-runtime'

function openScanModel() {
PromptActionClass.setContext(getAbilityContext() as UIContext);
PromptActionClass.setOptions({ alignment: DialogAlignment.Top, offset: { dx: 0, dy: 50 } } as promptAction.BaseDialogOptions);
PromptActionClass.openDialog();
}
export { openScanModel as openScanModel };

PromptDialog.ets文件:实现一个极简的弹窗

——————————————————————————
import { BusinessError } from '@kit.BasicServicesKit';
import { ComponentContent, promptAction, UIContext } from '@kit.ArkUI';

class Params {
text: string = "";

constructor(text: string) {
this.text = text;
}
}

@Builder
function buildText(params: Params) {
Column() {
Text(params.text)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 36 })
Button('Close')
.onClick(() => {
PromptActionClass.closeDialog();
})
}.backgroundColor('#FFF0F0F0')
}

export class PromptActionClass {
static ctx: UIContext;
static contentNode: ComponentContent<Object>;
static options: promptAction.BaseDialogOptions;

static setContext(context: UIContext) {
PromptActionClass.ctx = context;
PromptActionClass.contentNode = new ComponentContent(context, wrapBuilder(buildText), new Params('this.message'))
}

static setContentNode(node: ComponentContent<Object>) {
PromptActionClass.contentNode = node;
}

static setOptions(options: promptAction.BaseDialogOptions) {
PromptActionClass.options = options;
}

static openDialog() {
if (PromptActionClass.contentNode !== null) {
PromptActionClass.ctx.getPromptAction().openCustomDialog(PromptActionClass.contentNode, PromptActionClass.options)
.then(() => {
console.info('OpenCustomDialog complete.');
})
.catch((error: BusinessError) => {
let message = (error as BusinessError).message;
let code = (error as BusinessError).code;
console.error(OpenCustomDialog args error code is ${code}, message is ${message});
})
}
}

static closeDialog() {
if (PromptActionClass.contentNode !== null) {
PromptActionClass.ctx.getPromptAction().closeCustomDialog(PromptActionClass.contentNode)
.then(() => {
console.info('CloseCustomDialog complete.');
})
.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});
})
}
}
}

求各位大佬指点

2025-08-05 21:31 负责人:无 分享
已邀请:
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

import { PromptAction, promptAction as _action } from '@kit.ArkUI';  

export const showDialog = () => {  
  const uiContext = UTSHarmony.getCurrentWindow()!.getUIContext()  
  const promptAction : PromptAction = uiContext.getPromptAction();  

  const config : _action.ShowDialogOptions = {  
    title: 'showDialog Title Info',  
    message: 'Message Info',  
    buttons: [  
      {  
        text: 'button1',  
        color: '#ff0000'  
      },  
      {  
        text: 'button2',  
        color: '#ffff00'  
      }  
    ]  
  }  

  return promptAction.showDialog(config)  
    .then(data => data.index)  
    .catch((err : Error) => {  
      console.info('showActionMenu error: ' + err);  
      return -1  
    })  
}

参考这个 uts api 插件

要回复问题请先登录注册