【学习笔记】HarmonyOS 鸿蒙Next 自定义一个全局调用的toast函数组件
【学习笔记】HarmonyOS 鸿蒙Next 自定义一个全局调用的toast函数组件
使用方式
import引入
import { showToast } from '../../../components/Loading';
传入字符转2s后自动消失
showToast(err || '登录失败,请重试')
不自动消失
const toast = showToast({
message: '登陆中...',
duration: 0,
})
// 手动关闭
toast.hide()
关闭所有
import { clearToast } from '../../../components/Loading';
clearToast()
全部代码如下
import { ComponentContent, PromptAction, promptAction, window } from "@kit.ArkUI"
import { JSON } from "@kit.ArkTS";
import { ObjectAssign } from "../utils/common";
export enum TypeEnum {
LOADING = 'loading',
TEXT = 'text'
}
export enum ToastAlignment {
CENTER = 0,
TOP = 1,
BOTTOM = 2
}
interface ToastModel {
message?: string
type?: TypeEnum
duration?: number
alignment?: ToastAlignment
}
@Builder
function loadingBuilder(params: ToastModel) {
Column() {
if (params.type === TypeEnum.LOADING) {
LoadingProgress()
.color(Color.White)
.width(50)
.margin({ bottom: 5 })
}
Text(params.message)
.fontColor(Color.White)
.fontSize(16)
.constraintSize({ maxWidth: '75%' })
.maxLines(params.type === TypeEnum.LOADING ? 1 : null)
.textOverflow({ overflow: params.type === TypeEnum.LOADING ? TextOverflow.Ellipsis : TextOverflow.None })
}
.padding(params.type === TypeEnum.LOADING ? {
top: 10,
bottom: 15,
left: 25,
right: 25
} : {
top: 8,
bottom: 8,
left: 10,
right: 10
})
.offset({
y: params.alignment === ToastAlignment.CENTER ? '0' : params.alignment === ToastAlignment.TOP ? '-30%' : '30%'
})
.backgroundColor('rgba(0,0,0,0.8)')
.borderRadius(5)
.clip(true)
}
let dialogIds: Array<ComponentContent<ESObject> | null] = []
class toast {
loading: ComponentContent<ESObject> | null = null
promptAction: PromptAction | null = null;
show(params: ToastModel) {
window.getLastWindow(getContext()).then(windowClass => {
const uiContext = windowClass.getUIContext()
this.loading = new ComponentContent(uiContext, wrapBuilder(loadingBuilder), params);
this.promptAction = uiContext.getPromptAction()
this.promptAction.openCustomDialog(this.loading,
{
alignment: DialogAlignment.Center,
isModal: true,
autoCancel: false
}
)
dialogIds.push(this.loading)
})
if (params.duration !== 0) {
const timer = setTimeout(() => {
clearTimeout(timer)
this.hide()
}, params.duration)
}
return this
}
hide() {
this.promptAction?.closeCustomDialog(this.loading)
.then(() => {
this.loading?.dispose()
})
dialogIds = dialogIds.filter(item => item !== this.loading)
}
clear() {
try {
for (let index = 0; index < dialogIds.length; index++) {
const dialog: ESObject = dialogIds[index];
this.promptAction?.closeCustomDialog(dialog)
}
dialogIds = []
} catch (err) {
return
}
}
}
const newToast = new toast()
/**
* Toast 轻提示
* @param params = string 入参为字符串则是提示文本
* params = ToastModel
* @param message 提示文本
* @param type 提示类型 TypeEnum.LOADING 带有加载图标 TypeEnum.TEXT 纯文本
* @param duration 显示时长 0表示不主动关闭
*/
export const showToast = (params?: ToastModel | string): toast => {
let newParams: ToastModel = {
message: 'loading...',
type: TypeEnum.LOADING,
duration: 2000,
alignment: ToastAlignment.CENTER
}
if (typeof params === 'string') {
newParams.message = params
newParams.type = TypeEnum.TEXT
} else if (params) {
newParams = ObjectAssign(newParams as ESObject, params)
}
return newToast.show(newParams)
}
/**
* 关闭所有提示弹窗
*/
export const clearToast = (): void => newToast.clear()
更多关于【学习笔记】HarmonyOS 鸿蒙Next 自定义一个全局调用的toast函数组件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于【学习笔记】HarmonyOS 鸿蒙Next 自定义一个全局调用的toast函数组件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS 鸿蒙Next中,自定义一个全局调用的toast函数组件,可以通过以下步骤实现:
-
创建Toast组件: 首先,需要创建一个自定义的Toast组件。这通常涉及在项目的资源文件中定义一个Toast的布局,并在代码中实现其显示逻辑。
-
实现Toast服务: 为了实现全局调用,可以创建一个服务类(如
ToastService
),在该类中封装Toast的显示方法。此方法应接收必要的参数(如显示的文本),并控制Toast的显示。 -
注册服务: 将Toast服务类注册为全局可用的服务,这样在任何地方都可以通过服务调用显示Toast。
-
调用Toast: 在需要显示Toast的地方,通过服务调用之前封装的显示方法即可。
具体实现时,可能需要利用HarmonyOS提供的API来创建和管理服务,以及控制UI组件的显示。
请注意,由于HarmonyOS的API和框架可能随着版本更新而变化,因此上述步骤可能需要根据实际使用的HarmonyOS版本进行调整。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html