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}
);
})
}
}
}
求各位大佬指点
1 个回复
DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信
参考这个 uts api 插件