鸿蒙开发:wrapBuilder传递参数

思路参考链接:mp.weixin.qq.com/s/GzbZs6OPb...

我们先创建好主页面,将自定义的@Builder写好

scss 复制代码
// PageIndex.ets

import { DialogUtils } from './DialogUtils'

// 自定义的页面 Builder
@Builder
function messageView()  {
  Column({ space: 10 }) {
    Text("自定义的文本")
      .width("100%")
      .fontColor(Color.White)
      .textAlign(TextAlign.Center)
      .margin({ top: 20, bottom: 20 })
      .backgroundColor(getRandomTransparentOfRgba())
      Row() {
        Image($r("app.media.app_icon"))
          .size({ width: 50 })
          .objectFit(ImageFit.Contain)
      }
      .width("100%")
      .justifyContent(FlexAlign.Center)
      .backgroundColor(getRandomTransparentOfRgba())

    Row() {
      Image($r("app.media.app_icon"))
        .size({ width: 50 })
        .objectFit(ImageFit.Contain)
    }
    .width("100%")
    .justifyContent(FlexAlign.Center)
    .backgroundColor(getRandomTransparentOfRgba())

    Blank()
      .height(10)
  }
}

function getRandomTransparentOfRgba() {
  const randomValue = () => Math.floor(Math.random() * 256);
  const r = randomValue();
  const g = randomValue();
  const b = randomValue();
  return `rgba(${r}, ${g}, ${b}, 0.5)`;
}

@Entry
@Component
struct Index {
  build() {
    Column() {
      Button("点击")
        .onClick(() => {
        // 这里就是具体类功能实现的地方
          DialogUtils.get()
            .showDialog(this.getUIContext(), {
              title: "标题来咯~",
              messageView: wrapBuilder(messageView),
              messageData: "测试数据"
            })
        })
    }.width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

然后是我们的功能类,可以实现的功能如下

  1. 可以传入自定义的@Builder
  2. 自定义的titile
typescript 复制代码
// DialogUtils.ets

import { ComponentContent } from "@kit.ArkUI"
import { DialogAttribute } from "./DialogAttribute"

export class DialogUtils {
  private constructor() {
  }

  private static mDialogUtils: DialogUtils

  public static get() {
    if (DialogUtils.mDialogUtils == undefined) {
      DialogUtils.mDialogUtils = new DialogUtils()
    }
    return DialogUtils.mDialogUtils
  }

  showDialog(context: UIContext, dialogAttribute?: DialogAttribute) {
    if (dialogAttribute == undefined) {
      dialogAttribute = new DialogAttribute()
    }
    this.show(context, dialogAttribute)
  }

  private show(context: UIContext, object: Object) {
    let dView = wrapBuilder<Object[]>(dialogView)
    let dialogContent: ComponentContent<Object> = new ComponentContent(context, dView, object)
    context.getPromptAction().openCustomDialog(dialogContent)
  }
}

@Builder
function dialogView(dialogAttribute?: DialogAttribute) {
  Column() {
    Text(dialogAttribute?.title)
      .fontSize(16)
      .fontWeight(FontWeight.Bold)
      .margin({ top: 10 })

    Text(dialogAttribute?.messageData?.toString())
      .margin({ top: 10, bottom: 10 })
      .fontColor(Color.Red)

    //message是一个组件视图
    if (dialogAttribute?.messageView != undefined) {
      dialogAttribute?.messageView.builder()
    }

    Row() {
      Text("取消")
        .height(40)
        .textAlign(TextAlign.Center)
        .layoutWeight(1)
      Text("确定")
        .height(40)
        .layoutWeight(1)
        .textAlign(TextAlign.Center)
    }.width("100%")
  }.width("80%")
  .backgroundColor(Color.White)
  .borderRadius(10)
}

这个类的调用也很简单,如下调用

kotlin 复制代码
          DialogUtils.get()
            .showDialog(this.getUIContext(), {
              title: "标题来咯~",
              messageView: wrapBuilder(messageView),
              messageData: "测试数据"
            })

需要补充数据结构定义如下;

typescript 复制代码
// DialogAttribute.ets
export class DialogAttribute {
  title?: string
  messageView?: WrappedBuilder<Object[]>
  messageData?: object | string
}

以上就是关于如何实现一个自定义布局的全局范围弹窗

实现了基本的自定义UI,实现数据的传递

那么可以思考一下

如果是点击确认/取消,我们应该如何实现呢?

相关推荐
沙蒿同学15 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
变与不变80616 小时前
jQuery细节以及使用应用场景
前端·javascript·jquery
SailingCoder18 小时前
【封闭结束1】端到端交付:Agent 一次请求如何走完全链路
前端·安全·ai·面试·agent·harness
风骏时光牛马20 小时前
AI多模块协同自动化工作流
前端
zhangminghuan20 小时前
前端面试应对技巧
前端·面试·职场和发展
计算机魔术师20 小时前
潜伏14年的PHP致命洞,AI跑两天就交卷了
前端
IT_陈寒20 小时前
Vue的这个响应式陷阱我居然现在才发现
前端·人工智能·后端
Python自动化直播1 天前
智能脚本批量管理拆开看:导入、导出、重写、试听
前端·python·ai·秒播
开开心心就好1 天前
发票信息录入太麻烦?离线工具一键转表格
运维·服务器·前端·pdf·ocr·maven·intellij-idea