HarmonyOS鸿蒙Next《仿盒马》app开发技术分享兑换商品详情

HarmonyOS鸿蒙Next《仿盒马》app开发技术分享兑换商品详情

技术栈

Appgallery connect

开发准备

上一节我们实现了兑换商品列表的展示,用户可以在回收之后通过积分页面进入兑换列表页查看当前能够兑换的商品了,我们距离一个完整的app又更近了一步,现在我们要实现的就是当用户点击列表条目的时候能够查看数据详情。

功能分析

在数据列表展示的时候其实我们已经获取到了当前商品的大部分数据,但是为了获取内容的实时性,保证跟云端能够匹配,我们还是通过id查询的方式查询用户点击条目的对应商品数据。查询出对应的商品条目数据后,我们在列表上进行展示

代码实现

首先我们把兑换商品的id 传递到详情页面

.onClick(() => {
    let product: ProductDetailModel = {
        id: item.id
    };
    router.pushUrl({
        url: 'pages/recycle/points/PointsDetailsPage',
        params: product
    }, (err) => {
        if (err) {
            console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
            return;
        }
    });
})

接收id进行数据查询

@State pointsProduct:PointsProduct|null=null

async aboutToAppear(): Promise<void> {
    let databaseZone = cloudDatabase.zone('default');
    let product = await router.getParams() as ProductDetailModel;
    let condition1 = new cloudDatabase.DatabaseQuery(points_product);
    condition1.equalTo("id",product.id)
    let productDetail = await databaseZone.query(condition1);
    let json = JSON.stringify(productDetail)
    let list:PointsProduct[]= JSON.parse(json)
    this.pointsProduct=list[0]
}

展示其他数据到对应的组件

build() {
    Stack({alignContent:Alignment.Bottom}){
        Scroll(this.scroller){
            Column() {
                CommonTopBar({ title: "商品详情", alpha: 0, titleAlignment: TextAlign.Center ,backButton:true})
                Image(this.pointsProduct?.url)
                    .width('100%')
                    .height(300)
                    .objectFit(ImageFit.Cover)
                Column({space:10}){
                    Row(){
                        Text(){
                            Span("$")
                                .fontSize(14)
                                .fontColor(Color.Red)
                            Span(this.pointsProduct?.points+"")
                                .fontSize(22)
                                .fontColor(Color.Red)
                        }
                    }
                    .padding(10)

                    Text(this.pointsProduct?.name)
                        .fontSize(20)
                        .fontColor(Color.Black)
                        .margin({left:10})
                        .fontWeight(FontWeight.Bold)
                    Text(this.pointsProduct?.text_message)
                        .fontSize(14)
                        .fontColor(Color.Gray)
                        .margin({left:10})
                    Row(){
                        Text()
                        Text("已兑换 "+this.pointsProduct?.sales_volume)
                            .fontSize(14)
                            .fontColor(Color.Black)
                            .margin({left:20})
                    }
                    .padding(10)
                    .width('100%')
                    .justifyContent(FlexAlign.SpaceBetween)

                    Divider().width('100%')
                        .height(5).backgroundColor("#f7f7f7")

                    Row(){
                        Text("发货")
                            .fontColor(Color.Gray)
                            .fontSize(14)
                        Text(this.pointsProduct?.delivery_time+"")
                            .fontSize(14)
                            .margin({left:20})
                            .fontColor(Color.Black)
                    }
                    .padding(10)
                    .width('100%')
                    .justifyContent(FlexAlign.Start)

                    Divider().width('100%')
                        .height(5).backgroundColor("#f7f7f7")

                    Row(){
                        Text("参数")
                            .fontColor(Color.Gray)
                            .fontSize(14)
                        Text("储存:")
                            .margin({left:20})
                            .fontSize(14)
                            .fontColor(Color.Black)
                        Text(this.pointsProduct?.parameter)
                            .fontSize(14)
                            .fontColor(Color.Black)
                    }
                    .padding(10)
                    .width('100%')
                    .justifyContent(FlexAlign.Start)

                    Divider().width('100%')
                        .height(5).backgroundColor("#f7f7f7")

                    Row(){
                        Text("规格")
                            .fontColor(Color.Gray)
                            .fontSize(14)
                        Column({space:5}){
                            Text(this.pointsProduct?.spec_str)
                                .fontSize(14)
                                .fontColor(Color.Black)
                        }
                        .alignItems(HorizontalAlign.Start)
                        .margin({left:20})
                    }
                    .padding(10)
                    .width('100%')
                    .justifyContent(FlexAlign.Start)

                    Divider().width('100%')
                        .height(5).backgroundColor("#f7f7f7")
                }
                .alignItems(HorizontalAlign.Start)
            }
            .alignItems(HorizontalAlign.Start)
            .backgroundColor(Color.White)

        }
        .padding({bottom:80})
        .height('100%')
        .width('100%')
        Row(){
            Text()
            Blank()
            Text("立即兑换")
                .padding(10)
                .width('45%')
                .textAlign(TextAlign.Center)
                .backgroundColor("#FCDB29")
                .fontColor(Color.White)
                .borderRadius(15)
                .onClick(()=>{})
        }
        .padding(15)
        .justifyContent(FlexAlign.SpaceBetween)
        .width('100%')
        .backgroundColor(Color.White)
    }
    .backgroundColor(Color.White)
}

到这里我们就实现了兑换物品的商品详情页


更多关于HarmonyOS鸿蒙Next《仿盒马》app开发技术分享兑换商品详情的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中开发《仿盒马》兑换商品详情页,需使用ArkUI框架。布局采用Column/Row嵌套实现商品信息展示,商品图片使用Image组件加载网络资源。兑换按钮通过Button组件实现点击事件,调用自定义弹窗确认兑换。商品数据通过@State装饰器管理状态,使用@Link实现父子组件数据同步。网络请求采用ohos.net.http模块获取商品详情数据。页面路由通过router.pushUrl实现跳转传递参数。商品规格选择使用picker组件实现多选项交互。

更多关于HarmonyOS鸿蒙Next《仿盒马》app开发技术分享兑换商品详情的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


从代码实现来看,这个商品详情页的开发思路很清晰,主要包含以下几个关键点:

  1. 数据传递方面使用了router.pushUrl()方法将商品ID传递到详情页,这是HarmonyOS推荐的页面跳转方式。建议可以补充参数校验逻辑,确保传递的ID有效性。

  2. 数据查询部分使用了AppGallery Connect的云数据库服务,通过equalTo条件查询特定ID的商品数据。这里可以考虑添加查询失败的处理逻辑,比如网络异常等情况。

  3. UI布局采用了Stack+Scroll+Column的组合,实现了滚动查看详情+底部固定兑换按钮的效果,这是电商类APP常见的布局方式。

  4. 商品信息展示使用了丰富的ArkUI组件,包括Image、Text、Row、Column等,并设置了合理的样式和间距。

  5. 代码中使用了@State装饰器来管理商品数据状态,这是响应式开发的标准做法。

整体实现符合HarmonyOS应用开发规范,代码结构清晰。后续可以考虑添加图片懒加载、兑换按钮防重复点击等优化点。

回到顶部