鸿蒙分享(四):弹窗简单封装

代码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12

引用的harmony-utils地址:OpenHarmony三方库中心仓

引用的harmony-dialog地址:OpenHarmony三方库中心仓

引用的loading-dialog地址OpenHarmony三方库中心仓

import LoadingDialog from '@lyb/loading-dialog'
import { ToastUtil } from '@pura/harmony-utils'
import { BaseDialogOptions, DialogHelper } from '@pura/harmony-dialog'
import { BaseOptions } from './BaseOptions'
import { DialogParams } from './DialogParams'
import { BaseConfirmDialog } from './BaseConfirmDialog'

/**
 * 弹窗类
 */
export class BaseDialog {
  //确定弹窗
  static showConfirmDialog(params: DialogParams) {
    params.isClickClose = true
    let drawer: BaseOptions = {
      params: params,
      alignment: DialogAlignment.Center,
      offset: { dx: 0, dy: 0 },
      autoCancel: params.autoCancel ?? false,
      backCancel: params.backCancel ?? false,
    }
    if (BaseDialog.isDialogShowing(drawer.dialogId)) {
      BaseDialog.hintDialog(drawer.dialogId)
    }
    return DialogHelper.showCustomDialog(wrapBuilder(BuilderConfirmDialog), drawer)
  }

  //自定义弹窗
  static showCustomDialog<T extends BaseDialogOptions>(builder: WrappedBuilder<[T]>, options: T): string {
    return DialogHelper.showCustomDialog(builder, options)
  }


  static showToast(content: string | Resource) {
    ToastUtil.showToast(content, {
      duration: 2000,
      alignment: Alignment.Bottom,
    })
  }

  static showLoading(msg: string = "加载中...") {
    LoadingDialog.showLoading({
      msg: msg,
      tintColor: Color.White,
      textColor: Color.White,
    })
  }

  static showProgress(progress: number) {
    LoadingDialog.showProgress("", progress)
  }

  static hideProgress() {
    LoadingDialog.hide()
  }

  static hintLoading() {
    LoadingDialog.hide()
  }

  static hintDialog(dialogId?: string) {
    DialogHelper.closeDialog(dialogId)
  }

  static isDialogShowing(dialogId?: string): boolean {
    return DialogHelper.isShowing(dialogId)
  }
}

//确认弹窗
@Builder
function BuilderConfirmDialog(options: BaseOptions) {
  BaseConfirmDialog({
    params: options.params,
    dialogId: options.dialogId
  })
}

import { BaseImage } from '../../view/BaseImage'
import { BaseDialog } from './BaseDialog'
import { DialogParams } from './DialogParams'

//确定弹窗
@Component
export struct BaseConfirmDialog {
  @Prop params: DialogParams
  @Prop dialogId: string

  build() {
    Stack({
      alignContent: Alignment.Top
    }) {

      Column() {
        if (this.params.title) {
          Text(this.params.title)
            .fontSize(16)
            .textAlign(TextAlign.Center)
            .fontColor($r("app.color.color_10141A"))
            .margin({ top: 43 })
        }
        if (this.params.content) {
          Text(this.params.content)
            .fontSize(12)
            .fontColor($r("app.color.color_8E98AA"))
            .textAlign(TextAlign.Center)
            .margin({ top: 10 })
        }
        Row() {
          if (!this.params.isHideCancelBtnText) {
            Button(this.params.cancelBtnText)
              .border({ width: 1, color: this.params.primaryColor })
              .backgroundColor(Color.Transparent)
              .fontColor(this.params.primaryColor)
              .fontSize(14)
              .onClick(() => {
                if (this.params.onCancel) {
                  this.params.onCancel()
                  if (this.params.isClickClose) {
                    BaseDialog.hintDialog(this.dialogId)
                  }
                } else {
                  BaseDialog.hintDialog(this.dialogId)
                }
              })
              .layoutWeight(1)
            Blank()
              .margin({ left: 15, right: 15 })
          }
          Button(this.params.confirmBtnText)
            .backgroundColor(this.params.primaryColor)
            .fontColor(Color.White)
            .fontSize(14)
            .onClick(() => {
              if (this.params.onConfirm) {
                this.params.onConfirm(this.dialogId)
                if (this.params.isClickClose) {
                  BaseDialog.hintDialog(this.dialogId)
                }
              } else {
                BaseDialog.hintDialog(this.dialogId)
              }
            })
            .layoutWeight(1)
        }.margin({ top: 20 })
        .width("100%")
        .justifyContent(FlexAlign.SpaceBetween)
      }
      .backgroundColor(Color.White)
      .width("80%")
      .padding({ left: 23, right: 23, bottom: 21 })
      .margin({
        top: this.params?.headIcon == null ? 0 : 70
      })
      .borderRadius(20)

      if (this.params.headIcon) {
        BaseImage({
          src: this.params?.headIcon,
          mWidth: 93,
          mHeight: 81,
        })
      }
    }
  }
}

import { BaseDialogOptions } from '@pura/harmony-dialog';
import { DialogParams } from './DialogParams';

//自定义弹框
export interface BaseOptions extends BaseDialogOptions {
  width?: number;
  params?: DialogParams;
}

@Observed
export class DialogParams {
  dialogId?: string
  headIcon?: Resource;
  primaryColor?: string | Resource;
  title?: string | Resource;
  content?: string | Resource;
  cancelBtnText?: string | Resource = "取消";
  confirmBtnText?: string | Resource = "确定";
  isHideCancelBtnText?: boolean = false;
  onCancel?: () => void;
  onConfirm?: (dialogId: string) => void;
  //点击按钮且关闭弹窗
  isClickClose?: boolean = true;
  backCancel?: boolean = false;
  autoCancel ?: boolean = false;
}
相关推荐
深海的鲸同学 luvi4 小时前
【HarmonyOS NEXT】华为分享-碰一碰开发分享
华为·harmonyos·碰一碰·华为分享
沅霖10 小时前
鸿蒙harmony json转对象(2)
harmonyos
AGI学习社12 小时前
2024中国排名前十AI大模型进展、应用案例与发展趋势
linux·服务器·人工智能·华为·llama
kirk_wang1 天前
Flutter调用HarmonyOS NEXT原生相机拍摄&相册选择照片视频
flutter·华为·harmonyos
星释1 天前
鸿蒙Flutter实战:17-无痛上架审核指南
flutter·华为·harmonyos
jikuaidi6yuan1 天前
鸿蒙操作系统的安全架构
华为·harmonyos·安全架构
HarderCoder1 天前
鸿蒙开发者认证-题库(二)
harmonyos
轻口味1 天前
HarmonyOS Next 最强AI智能辅助编程工具 CodeGenie介绍
人工智能·华为·harmonyos·deveco-studio·harmonyos-next·codegenie
jikuaidi6yuan1 天前
除了基本的事件绑定,鸿蒙的ArkUI
华为·harmonyos
GY-931 天前
Flutter中PlatformView在鸿蒙中的使用
flutter·harmonyos