【学习笔记】HarmonyOS 鸿蒙Next 自定义一个全局调用的toast函数组件

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

【学习笔记】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

1 回复

更多关于【学习笔记】HarmonyOS 鸿蒙Next 自定义一个全局调用的toast函数组件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS 鸿蒙Next中,自定义一个全局调用的toast函数组件,可以通过以下步骤实现:

  1. 创建Toast组件: 首先,需要创建一个自定义的Toast组件。这通常涉及在项目的资源文件中定义一个Toast的布局,并在代码中实现其显示逻辑。

  2. 实现Toast服务: 为了实现全局调用,可以创建一个服务类(如ToastService),在该类中封装Toast的显示方法。此方法应接收必要的参数(如显示的文本),并控制Toast的显示。

  3. 注册服务: 将Toast服务类注册为全局可用的服务,这样在任何地方都可以通过服务调用显示Toast。

  4. 调用Toast: 在需要显示Toast的地方,通过服务调用之前封装的显示方法即可。

具体实现时,可能需要利用HarmonyOS提供的API来创建和管理服务,以及控制UI组件的显示。

请注意,由于HarmonyOS的API和框架可能随着版本更新而变化,因此上述步骤可能需要根据实际使用的HarmonyOS版本进行调整。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部