news 2026/2/28 12:28:56

FlutterOpenHarmony商城App订单列表组件开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FlutterOpenHarmony商城App订单列表组件开发

前言

订单列表是商城应用中用户查看和管理订单的核心页面,用户可以在这里查看所有订单的状态、进行订单操作如取消、确认收货、申请退款等。一个设计良好的订单列表组件需要清晰地展示订单信息,并提供便捷的操作入口。本文将详细介绍如何在Flutter和OpenHarmony平台上开发订单列表相关组件,包括订单卡片、订单状态标签、订单操作按钮等核心模块。

订单列表的设计需要考虑不同状态订单的展示差异,待付款、待发货、待收货、已完成、已取消等状态的订单需要显示不同的信息和操作按钮。同时,订单列表通常数据量较大,需要支持分页加载和状态筛选,确保用户能够快速找到目标订单。

Flutter订单数据模型

首先定义订单数据的模型结构:

classOrder{finalString id;finalString orderNo;finalOrderStatus status;finalList<OrderItem>items;finaldouble totalAmount;finalDateTime createTime;constOrder({requiredthis.id,requiredthis.orderNo,requiredthis.status,requiredthis.items,requiredthis.totalAmount,requiredthis.createTime,});}

Order类包含了订单的核心信息。id是订单唯一标识符,orderNo是订单编号用于展示给用户。status是订单状态枚举,items是订单商品列表,totalAmount是订单总金额,createTime是下单时间。这种数据模型的设计覆盖了订单列表展示的主要需求,同时保持了结构的简洁性,便于与后端API对接。

订单状态枚举定义:

enumOrderStatus{pending,// 待付款paid,// 待发货shipped,// 待收货completed,// 已完成cancelled,// 已取消refunding,// 退款中}extensionOrderStatusExtensiononOrderStatus{Stringgetlabel{switch(this){caseOrderStatus.pending:return'待付款';caseOrderStatus.paid:return'待发货';caseOrderStatus.shipped:return'待收货';caseOrderStatus.completed:return'已完成';caseOrderStatus.cancelled:return'已取消';caseOrderStatus.refunding:return'退款中';}}}

OrderStatus枚举定义了订单的所有可能状态,使用扩展方法为每个状态提供对应的中文标签。枚举类型比字符串更加类型安全,可以在编译时发现状态值的错误。扩展方法将状态标签的获取逻辑封装在枚举类型上,使用时只需调用status.label即可获得对应的中文文本,代码更加简洁易读。

订单列表组件

classOrderListextendsStatelessWidget{finalList<Order>orders;finalbool isLoading;finalbool hasMore;finalVoidCallback?onLoadMore;finalValueChanged<Order>?onOrderTap;constOrderList({Key?key,requiredthis.orders,this.isLoading=false,this.hasMore=true,this.onLoadMore,this.onOrderTap,}):super(key:key);@overrideWidgetbuild(BuildContext context){returnListView.separated(padding:constEdgeInsets.all(16),itemCount:orders.length+(hasMore?1:0),separatorBuilder:(_,__)=>constSizedBox(height:12),itemBuilder:(context,index){if(index==orders.length){return_buildLoadingIndicator();}returnOrderCard(order:orders[index],onTap:()=>onOrderTap?.call(orders[index]),);},);}}

OrderList组件负责展示订单列表,支持上拉加载更多功能。ListView.separated使用分隔构建器在订单卡片之间添加间距。itemCount在订单数量基础上加1用于显示加载指示器,当hasMore为false时不显示。组件将数据获取逻辑交给父组件处理,自身只负责UI展示,符合单一职责原则。这种设计使组件可以在不同页面复用,如全部订单、待付款订单等不同筛选条件的列表。

订单卡片组件

classOrderCardextendsStatelessWidget{finalOrder order;finalVoidCallback?onTap;constOrderCard({Key?key,requiredthis.order,this.onTap,}):super(key:key);@overrideWidgetbuild(BuildContext context){returnGestureDetector(onTap:onTap,child:Container(padding:constEdgeInsets.all(16),decoration:BoxDecoration(color:Colors.white,borderRadius:BorderRadius.circular(8),boxShadow:[BoxShadow(color:Colors.black.withOpacity(0.05),blurRadius:4,offset:constOffset(0,2),),],),child:Column(children:[_buildHeader(),constDivider(height:24),_buildItems(),constSizedBox(height:12),_buildFooter(),],),),);}}

OrderCard组件展示单个订单的详细信息。Container设置白色背景、圆角和阴影,营造卡片效果。Column垂直排列订单头部、商品列表和底部操作区,Divider在头部和商品列表之间添加分隔线。GestureDetector包装整个卡片,点击时跳转到订单详情页。这种布局结构清晰,信息层级分明,用户可以快速获取订单的关键信息。

订单头部实现:

Widget_buildHeader(){returnRow(mainAxisAlignment:MainAxisAlignment.spaceBetween,children:[Text('订单编号:${order.orderNo}',style:constTextStyle(fontSize:13,color:Color(0xFF666666),),),Container(padding:constEdgeInsets.symmetric(horizontal:8,vertical:2,),decoration:BoxDecoration(color:_getStatusColor().withOpacity(0.1),borderRadius:BorderRadius.circular(2),),child:Text(order.status.label,style:TextStyle(fontSize:12,color:_getStatusColor(),),),),],);}

订单头部显示订单编号和状态标签。订单编号使用灰色小字号,作为辅助信息展示。状态标签使用彩色背景和文字,不同状态使用不同颜色以便用户快速识别。Row使用spaceBetween将订单编号和状态标签分别放置在左右两侧。_getStatusColor方法根据订单状态返回对应的颜色值,待付款使用橙色提醒用户付款,已完成使用绿色表示成功。

状态颜色获取方法:

Color_getStatusColor(){switch(order.status){caseOrderStatus.pending:returnconstColor(0xFFFF9800);caseOrderStatus.paid:caseOrderStatus.shipped:returnconstColor(0xFF2196F3);caseOrderStatus.completed:returnconstColor(0xFF4CAF50);caseOrderStatus.cancelled:returnconstColor(0xFF9E9E9E);caseOrderStatus.refunding:returnconstColor(0xFFE53935);}}

不同订单状态使用不同的颜色进行视觉区分。待付款使用橙色表示需要用户关注和操作,待发货和待收货使用蓝色表示订单正在处理中,已完成使用绿色表示订单成功结束,已取消使用灰色表示订单已失效,退款中使用红色表示需要关注的异常状态。这种颜色编码帮助用户快速识别订单状态,提升浏览效率。

订单商品列表

Widget_buildItems(){returnColumn(children:order.items.take(2).map((item){returnPadding(padding:constEdgeInsets.only(bottom:8),child:Row(children:[ClipRRect(borderRadius:BorderRadius.circular(4),child:Image.network(item.imageUrl,width:60,height:60,fit:BoxFit.cover,),),constSizedBox(width:12),Expanded(child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[Text(item.name,style:constTextStyle(fontSize:14,color:Color(0xFF333333),),maxLines:1,overflow:TextOverflow.ellipsis,),constSizedBox(height:4),Text('¥${item.price.toStringAsFixed(2)} x${item.quantity}',style:constTextStyle(fontSize:12,color:Color(0xFF999999),),),],),),],),);}).toList(),);}

订单商品列表展示订单中的商品信息,使用take(2)只显示前两个商品,避免订单卡片过长。每个商品项包含图片、名称、价格和数量。图片使用60像素的正方形尺寸,圆角裁剪使外观更加柔和。商品名称限制单行显示,溢出时显示省略号。价格和数量使用灰色小字号作为辅助信息。这种布局在有限空间内展示了商品的关键信息,用户可以快速了解订单内容。

OpenHarmony订单列表实现

@Component struct OrderList{@Prop orders:OrderInfo[]=[]@Prop isLoading:boolean=false@Prop hasMore:boolean=trueprivateonLoadMore:()=>void=()=>{}privateonOrderTap:(order:OrderInfo)=>void=()=>{}build(){List(){ForEach(this.orders,(order:OrderInfo)=>{ListItem(){this.OrderCard(order)}.margin({bottom:12})})if(this.hasMore){ListItem(){this.LoadingIndicator()}}}.width('100%').height('100%').padding(16).onReachEnd(()=>{if(!this.isLoading&&this.hasMore){this.onLoadMore()}})}}

OpenHarmony的订单列表使用List组件实现。ForEach遍历订单数组生成列表项,每个ListItem设置底部外边距实现项间分隔。onReachEnd回调在滚动到底部时触发加载更多。条件渲染在hasMore为true时显示加载指示器。这种实现方式与Flutter版本功能一致,确保两个平台的用户体验统一。

订单数据接口定义:

interfaceOrderInfo{id:stringorderNo:stringstatus:stringitems:OrderItemInfo[]totalAmount:numbercreateTime:string}interfaceOrderItemInfo{id:stringname:stringimageUrl:stringprice:numberquantity:number}

TypeScript接口定义了订单和订单商品的数据结构。status使用string类型存储状态值,在实际使用时可以通过映射表获取对应的中文标签和颜色。createTime使用string类型存储ISO格式的时间字符串,便于与后端API对接。接口定义为组件提供了类型安全保障。

订单卡片ArkUI实现

@BuilderOrderCard(order:OrderInfo){Column(){this.CardHeader(order)Divider().margin({top:12,bottom:12})this.CardItems(order)this.CardFooter(order)}.width('100%').padding(16).backgroundColor(Color.White).borderRadius(8).shadow({radius:4,color:'#0D000000',offsetY:2}).onClick(()=>{this.onOrderTap(order)})}

@Builder装饰器定义了订单卡片的构建方法。Column垂直排列头部、分隔线、商品列表和底部操作区。Divider组件添加分隔线,margin设置上下边距。样式设置包括白色背景、圆角和阴影,与Flutter版本保持一致。onClick事件处理器在用户点击卡片时触发跳转到订单详情页。

订单头部ArkUI实现:

@BuilderCardHeader(order:OrderInfo){Row(){Text('订单编号:'+order.orderNo).fontSize(13).fontColor('#666666')Blank()Text(this.getStatusLabel(order.status)).fontSize(12).fontColor(this.getStatusColor(order.status)).padding({left:8,right:8,top:2,bottom:2}).backgroundColor(this.getStatusBgColor(order.status)).borderRadius(2)}.width('100%')}

Row水平排列订单编号和状态标签,Blank组件占据中间空间实现两端对齐。状态标签通过辅助方法getStatusLabel、getStatusColor、getStatusBgColor获取对应的文本、颜色和背景色。这种实现方式将状态相关的逻辑封装在方法中,使代码更加清晰易维护。

订单底部操作区

Widget_buildFooter(){returnRow(mainAxisAlignment:MainAxisAlignment.spaceBetween,children:[Text('共${order.items.length}件商品 合计:¥${order.totalAmount.toStringAsFixed(2)}',style:constTextStyle(fontSize:13,color:Color(0xFF333333),),),_buildActionButtons(),],);}Widget_buildActionButtons(){finalbuttons=<Widget>[];if(order.status==OrderStatus.pending){buttons.add(_buildButton('取消订单',false));buttons.add(constSizedBox(width:8));buttons.add(_buildButton('去付款',true));}elseif(order.status==OrderStatus.shipped){buttons.add(_buildButton('确认收货',true));}returnRow(children:buttons);}

订单底部显示商品总数、订单金额和操作按钮。左侧文字汇总订单信息,右侧根据订单状态显示不同的操作按钮。待付款订单显示取消订单和去付款按钮,待收货订单显示确认收货按钮。_buildButton方法根据isPrimary参数生成主要按钮或次要按钮,主要按钮使用红色背景,次要按钮使用灰色边框。这种设计让用户可以快速进行订单操作。

总结

本文详细介绍了Flutter和OpenHarmony平台上订单列表组件的开发过程。订单列表作为商城应用的核心功能页面,其设计质量直接影响用户的订单管理体验。通过订单卡片、状态标签、操作按钮等组件的合理设计,我们为用户提供了清晰的订单信息展示和便捷的操作入口。在实际项目中,还可以进一步添加订单筛选、订单搜索、物流跟踪等功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 4:02:12

浏览器代理实现理想数据抓取

浏览器代理实现理想数据抓取亮数据官方账号&#xff0c;大家可以关注&#xff1a;https://brightdata.blog.csdn.net/ 现在正有福利&#xff0c;免费的MCP&#xff0c; 有兴趣的伙伴可以访问链接&#xff1a; https://www.bright.cn/integration/firefox/?utm_sourcebrand&a…

作者头像 李华
网站建设 2026/2/26 7:37:06

LeetCode 01 背包 完全背包 题型总结

目录 一、背包问题核心理论 1. 背包问题定义 2. 通用解题框架 3. 遍历顺序底层逻辑 二、01 背包典型题目&#xff1a; &#xff08;一&#xff09;目标和&#xff08;LeetCode 494&#xff09; 1. 题目描述 2. 问题转化&#xff08;核心&#xff01;&#xff09; 3. 详…

作者头像 李华
网站建设 2026/2/28 13:56:44

ubuntu通过公网Ubuntu服务器远程桌面连接私网IPUbuntu

私网Ubuntu主机-------Ubuntu服务器---------私网IP Ubuntu主机第一部分&#xff1a;公网 Ubuntu 服务器部署 frps&#xff08;服务端&#xff09;步骤 1&#xff1a;安装依赖并下载 frp# 切换root&#xff08;避免频繁sudo&#xff09; sudo -i # 安装wget&#xff08;若未安装…

作者头像 李华
网站建设 2026/2/23 19:51:11

Unity学习笔记(十九)GUI控件(三)

窗口普通窗口private Rect dragWindow new Rect(400, 400, 200, 150);第一个参数 id是窗口的唯一ID&#xff0c;不要和别的窗口重复委托参数 是用于绘制窗口的函数 传入即可GUI.Window(1, new Rect(100, 100, 200, 150),DrawWindow,"测试窗口");id 除了区分不同窗口…

作者头像 李华
网站建设 2026/2/27 1:34:21

IPA 深度混淆是什么意思?分析其与普通混淆的区别

在一些安全讨论里&#xff0c;“IPA 深度混淆”这个词经常被提到&#xff0c;但真正落到工程实践时&#xff0c;不同团队对它的理解差异很大。 有人把它等同于“混淆得更狠一点”&#xff0c;也有人认为这是某种“高强度黑科技”。 从我接触过的项目来看&#xff0c;IPA 深度混…

作者头像 李华
网站建设 2026/2/27 11:10:28

33、Linux 内存管理全解析

Linux 内存管理全解析 1. 内存统计信息获取 在 Linux 系统中,我们可以通过调用 mallinfo() 函数来获取内存分配的统计信息。这个函数会以 mallinfo 结构体的形式返回统计数据,结构体是通过值传递,而非指针传递。 mallinfo 结构体的定义在 <malloc.h> 头文件…

作者头像 李华