鸿蒙开发:弹出库更新至1.2.2版本,新增模态页面弹出

前言

最近一段时间,自己把更多的精力放在了内部测试插件的开发,以至于,自己维护的很多库,大家在Github中Issues提的问题,迟迟没有第一时间进行解决,不是不解决,而是实在腾不出时间,还好,内部测试插件已经完成开发,所维护的库,接下来也会提了日程进行一一解决。

今天把弹窗库(dialog)进行了更新,由1.2.1版本更新至了1.2.2版本,此版本最大的改动有两个,一个是新增了模态页面弹出,第二个是,优化了使用底部弹出动画组件的数据更新。

所谓的模态页面,其实就是一种大面板大视图交互式的弹窗,和其他弹窗组件一样,通常用于在保持当前的上下文环境时,临时展示用户需关注的信息或待处理的操作,基础库中使用了openBindSheet的形式进行实现,主要目的是可以实现在任意位置,任意地方进行弹出,不受其它条件的约束。

弹出库其它功能的使用方式,之前有过介绍,在中心仓库中也有着很详细的介绍,这里就不过多介绍了,只把更新的部分做下概述,dialog弹出中心仓库地址:

ohpm.openharmony.cn/#/cn/detail...

模态页面弹出效果

模态页面功能实现

模态页面,所有的UI都有业务端自定义,所以在使用之前,请绘制好自己的模态页面UI。

1、普通模态页面

声明一个Builder用于展示模态页面UI。

TypeScript 复制代码
@Builder
  function sheetView() {
    Column() {
      Text("我是一个普通的模态页面")
        .width("100%")
        .height(100)
        .textAlign(TextAlign.Center)
    }
  }

在需要调用的地方使用,可以是任意的位置,默认弹出是全屏高度。

TypeScript 复制代码
showDialogSheet({ layout: wrapBuilder(sheetView) })

2、半模态高度(屏幕一半)

主要是通过height属性来设置模态页面的弹出高度,sheetView视图是自己定义的全局Builder。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: SheetSize.MEDIUM
  }
})

3、半模态高度(屏幕高度)

可以不设置,不设置也是默认的屏幕高度。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: SheetSize.LARGE
  }
})

4、半模态高度(自适应内容高度)

内容有多高,模态页面就会展示多高。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: SheetSize.FIT_CONTENT
  }
})

5、半模态高度(自定义高度)

也可以自由控制高度。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    height: 300
  }
})

6、隐藏关闭按钮

默认情况下,右上角会带关闭按钮,可以通过showClose设置为false来隐藏。

TypeScript 复制代码
showDialogSheet({
  layout: wrapBuilder(sheetView),
  options: {
    showClose: false
  }
})

7、模态页面更新样式

如果你想更新模态页面的样式,可以通过updateStyleDialogSheet方法进行更新。

TypeScript 复制代码
@Builder
function changeStyleSheetView(d: SheetData) {
  Column() {
    Text(d.title)
      .width("100%")
      .height(100)
      .textAlign(TextAlign.Center)
    Button("更改样式").onClick(() => {
      //其他属性不需要
      updateStyleDialogSheet({
        options: {
          backgroundColor: Color.Pink
        }
      })
    })
    Button("关闭")
      .margin({ top: 10 })
      .onClick(() => {
        closeDialogSheet()
      })
  }
}

export class SheetData {
  title?: string

  constructor(title?: string) {
    this.title = title
  }
}

8、模态页面更新数据

更新数据,通过updateDataDialogSheet方式来更新,传递不同数据即可。

TypeScript 复制代码
let sheetData1 = new SheetData("模态页面更新数据,3秒后我就会更新")
let sheetWrap1 = wrapBuilder(changeStyleSheetView)
showDialogSheet({
  layout: sheetWrap1,
  data: sheetData1
})
setTimeout(() => {
  updateDataDialogSheet(new SheetData("嘿嘿!我更新了~"))
}, 3000)

9、关闭模态页面

主动关闭页面,使用closeDialogSheet()方法进行关闭。

TypeScript 复制代码
let sheetData2 = new SheetData("测试关闭模态页面")
let sheetWrap2 = wrapBuilder(changeStyleSheetView)
showDialogSheet({
  layout: sheetWrap2,
  data: sheetData2
})

底部弹出动画组件数据更新

在之前的版本,如果你使用了BottomAnimationView做为根组件,来实现从底部的弹出动画,那么在使用自定义弹窗,使用updateDialogParams来更新数据时,是不生效的,因为组件做了层级嵌套,也就是绘制的UI是BottomAnimationView的子组件,数据呢也必须从BottomAnimationView中回调,否则数据是无法更新的,在最新版本已经优化了这一问题。

简单案例如下:

代码调用

TypeScript 复制代码
let params2 = new DialogParams()
        params2.title = "我是传递的参数"
        let builder2 = wrapBuilder(BottomBuilderDialogParams)
        showDialogParams(builder2, params2)
        clearTimeout(this.mTimeoutId)
        this.mTimeoutId = setTimeout(() => {
          let paramsBottom = new DialogParams()
          paramsBottom.title = "嘿嘿,我数据更新了"
          updateDialogParams(paramsBottom)
        }, 3000)

数据传递

数据传递主要通过BottomAnimationView定义的params属性。

TypeScript 复制代码
@Builder
function BottomChild(d: DialogData) {
  Column() {
    Text((d.data as DialogParams).title)
      .margin({ top: 30 })

    Row() {
      Button("取消").onClick(() => {
        //隐藏dialog
        hide()
      })
      Button("确定")
        .margin({ left: 30 })

    }.margin({ top: 20 })
    .margin({ top: 30 })
  }.backgroundColor(Color.White)
  .width("60%")
}

@Builder
function BottomBuilderDialogParams(params: DialogParams) {
  BottomAnimationView({
    params: params,
    layoutChild: wrapBuilder(BottomChild)
  })
}

相关总结

目前弹出库的下载量是六千四百多个,不算多,当然了在中心仓库中也不算少,希望大家在使用中,有问题多多提,也希望可以帮助到更多需要的人。

相关推荐
游戏开发爱好者810 分钟前
iOS WebView 远程调试实战 解决表单输入被键盘遮挡和焦点丢失问题
android·ios·小程序·https·uni-app·iphone·webview
他们都不看好你,偏偏你最不争气14 分钟前
iOS —— 3Gshare项目总结与思考
ui·ios·objective-c
没有用的阿吉29 分钟前
adb 指令大全
android·adb调试
amy_jork40 分钟前
android studio打包vue
android·vue.js·android studio
编程乐学1 小时前
网络资源模板--基于Android Studio 实现的校园心里咨询预约App
android·android studio·预约系统·大作业·移动端开发·安卓移动开发·心理咨询预约
涵涵子RUSH1 小时前
android studio(NewsApiDemo)100%kotlin
android·kotlin·android studio
九鼎创展科技1 小时前
直播一体机技术方案解析:基于RK3588S的硬件架构特性
android·嵌入式硬件·硬件架构
峥嵘life2 小时前
Android14 锁屏密码修改为至少6位
android·安全
迷曳10 小时前
28、鸿蒙Harmony Next开发:不依赖UI组件的全局气泡提示 (openPopup)和不依赖UI组件的全局菜单 (openMenu)、Toast
前端·ui·harmonyos·鸿蒙
Georgewu10 小时前
【HarmonyOS】ArkTS语法详细解析
harmonyos