HarmonyOS Next应用开发实战——底部弹框组件的实现(part2)

3. 排序方式选择对话框

点击"综合排序"可弹出排序方式选择对话框,用户可以选择不同的排序方式。

typescript 复制代码
Row(){
  Text('综合排序').fontSize(CommonConstants.M_FONT_SIZE)
  Image($r('app.media.ic_arrow_drop_down'))
    .width(CommonConstants.PIC_WIDTH).height(CommonConstants.PIC_HEIGHT)
}
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Center)
.onClick(() => {
  this.dialogController.open()
})

@CustomDialog
struct CustomDialogExample {
  cancel?: () => void
  controller: CustomDialogController

  build() {
    Column() {
      Text('排序方式').fontSize(CommonConstants.L_FONT_SIZE).margin({ top: 0, bottom: 20 })
      Column() {
        Text('综合排序').textDialogStyle()
        Text('距离优先').textDialogStyle()
        Text('价格优先').textDialogStyle().borderWidth(0)
      }
      .justifyContent(FlexAlign.Start)
      .alignItems(HorizontalAlign.Start)
      .width(CommonConstants.COLUMN_WIDTH)

      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('取消')
          .onClick(() => {
            this.controller.close()
            if (this.cancel) {
              this.cancel()
            }
          })
          .fontColor($r('app.color.main_color')).fontSize(CommonConstants.S_FONT_SIZE)
          .backgroundColor(Color.Transparent)
      }.margin({ bottom: CommonConstants.MAIN_PADDING })
    }
    .alignItems(HorizontalAlign.Start)
    .padding({
      top: CommonConstants.MAIN_PADDING * 2,
      right: CommonConstants.MAIN_PADDING * 2,
      left: CommonConstants.MAIN_PADDING * 2
    })
    .width(CommonConstants.COLUMN_WIDTH)
  }
}
4. 站点列表展示

使用List和ForEach组件展示站点列表,显示站点名称、距离、标签、充电桩类型和价格等信息。

typescript 复制代码
List({ space: CommonConstants.PUBLIC_SPACE }) {
  ForEach(this.StationList, (item: StationInfo, index: number) => {
    ListItem() {
      Column({ space: CommonConstants.PUBLIC_SPACE }) {
        Flex({ justifyContent: FlexAlign.SpaceBetween }) {
          Text(item.name).fontSize(CommonConstants.M_FONT_SIZE)
          Row({ space: CommonConstants.PUBLIC_SPACE / 2 }) {
            Image($r('app.media.ic_collect'))
              .width(CommonConstants.PIC_WIDTH / 2)
              .height(CommonConstants.PIC_HEIGHT / 2)
            Text(`${item.distance}km`).fontSize(CommonConstants.S_FONT_SIZE).fontColor('#a9a9a9')
          }
        }

        Row() {
          ForEach(item.tag as string[], (itemTag: string, index: number) => {
            Text(`${itemTag}`)
              .fontSize(CommonConstants.S_FONT_SIZE)
              .margin({ right: CommonConstants.PUBLIC_SPACE / 2 })
              .padding({ top: '2vp', right: '5vp', bottom: '2vp', left: '5vp' })
              .borderRadius(4)
              .backgroundColor('#e2e2e2')
          })
        }.width(CommonConstants.COLUMN_WIDTH)

        Flex({ justifyContent: FlexAlign.SpaceBetween }) {
          Row() {
            Row() {
              Text(`直流`)
                .fontSize(CommonConstants.S_FONT_SIZE)
                .backgroundColor('#ceffbc')
                .fontColor('#1ed013')
                .padding('2vp')
                .borderRadius(4)
              Text(`${item.direct}`).fontSize(CommonConstants.M_FONT_SIZE).fontWeight(600)
            }
            .margin({ right: '20vp' })

            Row() {
              Text(`交流`)
                .fontSize(CommonConstants.S_FONT_SIZE)
                .backgroundColor('#c3caf4')
                .fontColor('#0269da')
                .padding('2vp')
                .borderRadius(4)
              Text(`${item.alternating}`)
            }
          }

          Row() {
            Text(`¥${item.price}`)
            Text('/度起')
              .fontSize(CommonConstants.S_FONT_SIZE)
              .fontColor('#a9a9a9')
          }
          .alignItems(VerticalAlign.Bottom)
        }
      }
      .backgroundColor(Color.White)
      .borderRadius(CommonConstants.BORDER_RADIUS)
      .padding(CommonConstants.MAIN_PADDING)
    }
  })
}
.scrollBar(BarState.Off)
.layoutWeight(1)
5. 底部弹框显示与隐藏控制

通过点击"重新推荐"按钮控制底部弹框的显示与隐藏。

typescript 复制代码
build() {
  Column() {
    Button('重新推荐')
      .onClick(() => {
        this.isShow = true
      })
      .fontSize(CommonConstants.L_FONT_SIZE)
      .bindSheet($$this.isShow, this.myBuilder(), {
        detents: [SheetSize.MEDIUM, SheetSize.LARGE, 200],
        showClose: false,
        preferType: SheetType.CENTER,
        enableOutsideInteractive: true,
        shouldDismiss: ((sheetDismiss: SheetDismiss) => {
          sheetDismiss.dismiss()
        })
      })
  }
  .justifyContent(FlexAlign.Center)
}

通过以上核心功能的实现,开发者可以在HarmonyOS Next应用中创建一个功能完善的底部弹框组件。

相关推荐
熊猫钓鱼>_>10 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
KevinChaos11 小时前
阳台小花园开发手记 05|HarmonyOS 7.0 互动卡片:动效进出衔接
华为·harmonyos
WHMONY12 小时前
大一独立开发鸿蒙原生 AI Agent:聊聊我为什么死磕端侧模型与“技术平权”
harmonyos
todoitbo13 小时前
把 K-Lite「什么都能播」搬上鸿蒙 PC:影匣播放器的 FFmpeg + libass 原生移植实录
华为·ffmpeg·harmonyos·鸿蒙
威哥爱编程14 小时前
模拟面试智能体开发实战 05:给面试官接上题库和检索,题目结构化、大纲可溯源,AI 不再凭印象出题
python·agent·harmonyos
威哥爱编程15 小时前
模拟面试智能体开发实战 06:答得好怎么追问、答得错怎么点破,追问引擎让面试官会深挖会纠错
python·agent·harmonyos
c2892480843s16 小时前
【鸿蒙心迹】深色模式适配实战:资源限定词、动态取色与一张图两个主题
移动开发·harmonyos·鸿蒙·arkui·深色模式
贾伟康16 小时前
HarmonyOS API 26 Navigation 连续栈操作:中间过程合并、最终状态与强制新实例
harmonyos·arkts·navigation·navpathstack·路由治理
贾伟康1 天前
HarmonyOS API 26 Navigation 跨包路由:router_map、HSP 按需加载与失败回落
harmonyos·arkts·模块化·navigation·hsp
KevinChaos1 天前
阳台小花园开发手记 04|HarmonyOS 7.0 互动卡片:倾斜手机时的卡片效果
华为·harmonyos