HarmonyOS 鸿蒙Next showToast方法是否可以做成全局,不依赖当前页面?

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next showToast方法是否可以做成全局,不依赖当前页面?

如题,我现在有A,B两个页面,在B页面通过EventHub发送消息给A页面后,B页面会销毁,这时候在A页面接收消息想显示toast,prompt.showToast方法无效,是否可以将toast做成全局的?

2 回复

toast没有定制化能力,建议使用promptAction.openCustomDialog自定义实现这种透明的类似于showToast的效果。onWillDismiss回调中,通过reason得到阻拦关闭弹窗的操作类型,从而根据原因选择是否能关闭弹窗。 参考链接:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-methods-custom-dialog-box.md#customdialogcontrolleroptions%E5%AF%B9%E8%B1%A1%E8%AF%B4%E6%98%8E DismissReason12+

枚举相关链接参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-methods-alert-dialog-box-V5#ZH-CN_TOPIC_0000001930757005__dismissreason12

枚举说明 onWillDismiss 1.当用户执行点击遮障层关闭、左滑/右滑、三键back、键盘ESC关闭交互操作时,如果注册该回调函数,则不会立刻关闭弹窗。在回调函数中可以通过reason得到阻拦关闭弹窗的操作类型,从而根据原因选择是否能关闭弹窗。当前组件返回的reason中,暂不支持CLOSE_BUTTON的枚举值。

2.在onWillDismiss回调中,不能再做onWillDismiss拦截。

测试demo:

import promptAction from '[@ohos](/user/ohos).promptAction'

let customDialogId: number = 0

[@Builder](/user/Builder)
function customDialogBuilder() {
Column() {
Text('Custom dialog Message')
.fontSize(10)
Row() {
Button("确认").onClick(() => {
promptAction.closeCustomDialog(customDialogId)
})
Blank().width(50)
Button("取消").onClick(() => {
promptAction.closeCustomDialog(customDialogId)
})
}
}.height(200).padding(5)
}

[@Entry](/user/Entry)
[@Component](/user/Component)
struct CustomDialogPage {
[@State](/user/State) message: string = 'Hello World'

build() {
Row() {
Column() {
Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {
promptAction.openCustomDialog({
builder: customDialogBuilder.bind(this), onWillDismiss: (dismissDialogAction: DismissDialogAction) => {
console.info("reason" + JSON.stringify(dismissDialogAction.reason))
console.log("dialog onWillDismiss") /*if (dismissDialogAction.reason == DismissReason.PRESS_BACK) { dismissDialogAction.dismiss() } if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) { dismissDialogAction.dismiss() }*/
}
})
.then((dialogId: number) => {
customDialogId = dialogId
})
})
}.width('100%')
}.height('100%')
}
}

在HarmonyOS(鸿蒙)开发中,showToast 方法本身是一个用于显示简短消息的UI组件,通常与当前页面或上下文(Context)相关联。标准的 Toast 消息在Android及鸿蒙系统中都不是设计为全局的,而是与触发它的Activity或Ability(页面)绑定。

若你希望在应用的不同页面或组件间共享Toast功能,而不直接依赖于当前页面,可以考虑以下几种方式实现类似的全局效果:

  1. 自定义Toast管理类:创建一个全局可访问的类,负责管理和显示Toast。通过单例模式或依赖注入,你可以在应用中的任何地方调用这个管理类的方法来显示Toast。

  2. 事件总线:使用事件总线(如EventBus)在应用的不同组件间传递事件。当某个事件发生时,由事件总线通知并触发Toast显示。

  3. 服务(Service):虽然不常见,但理论上也可以通过服务来管理Toast的显示,不过这样做可能会增加复杂度且不是最佳实践。

这些方法均能帮助你在不直接依赖当前页面的情况下实现Toast的全局显示效果。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部