library; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:loopin/service/http.dart'; import 'package:loopin/api/shop_api.dart'; import 'package:shirne_dialog/shirne_dialog.dart'; import 'package:timer_count_down/timer_count_down.dart'; import 'package:loopin/utils/wxsdk.dart'; import 'package:loopin/utils/index.dart'; import '../../behavior/custom_scroll_behavior.dart'; class OrderDetail extends StatefulWidget { const OrderDetail({super.key}); @override State createState() => _OrderDetailState(); } class _OrderDetailState extends State with SingleTickerProviderStateMixin { late String _orderId; dynamic orderGoodsInfo; @override void initState() { super.initState(); _orderId = Get.arguments; getOrderDetail(orderId: _orderId); } // 获取订单详情信息,包含商品参数 void getOrderDetail({required String orderId}) async { try { final res = await Http.get('${ShopApi.goodsOrderDetail}/$orderId'); print('订单详情-------------->${res['data']}'); setState(() { orderGoodsInfo = res['data']; // 注意取 data 部分 }); } catch (e) { Get.back(); } } // 计算时间 int handleTime() { String dbTime = '2025-08-21 15:07:31.293'; DateTime orderTime = DateTime.parse(dbTime); // 计算过期时间 = 下单时间 + 15分钟 DateTime expireTime = orderTime.add(const Duration(minutes: 15)); // 剩余秒数 int remainSeconds = expireTime.difference(DateTime.now()).inSeconds; if (remainSeconds < 0) remainSeconds = 0; return remainSeconds; } Widget emptyTip() { return Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 5.0, children: [ Image.asset( 'assets/images/empty.png', width: 100.0, ), Text( '还没有订单信息~', style: TextStyle(color: Colors.grey, fontSize: 12.0), ) ], ); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.grey[50], appBar: AppBar( backgroundColor: Color(0xFFFF5000), foregroundColor: Colors.white, title: Text('订单详情'), titleSpacing: 1.0, // actions: [ // IconButton( // icon: Icon(Icons.help, size: 18.0), // onPressed: () {}, // ), // ], ), body: ScrollConfiguration( behavior: CustomScrollBehavior().copyWith(scrollbars: false), child: ListView( physics: BouncingScrollPhysics(), padding: EdgeInsets.all(10.0), children: [ Column( spacing: 5.0, children: [ Text.rich( TextSpan(style: TextStyle(fontFamily: 'Arial'), children: [ WidgetSpan( child: Icon( Icons.info, size: 16.0, )), TextSpan(text: ' 待支付, '), TextSpan(text: ' 剩余 '), // TextSpan( // text: '00 : 29 : 55', // style: TextStyle(color: Colors.red), // ), WidgetSpan( alignment: PlaceholderAlignment.middle, child: Countdown( // createtime // seconds: 15 * 60, // 15分钟 seconds: handleTime(), build: (_, double time) { int m = ((time % 3600) ~/ 60).toInt(); int s = (time % 60).toInt(); String formatted = "${m.toString().padLeft(2, '0')} : ${s.toString().padLeft(2, '0')}"; return Text( formatted, style: const TextStyle(color: Colors.red), ); }, interval: const Duration(seconds: 1), onFinished: () { print("倒计时结束"); }, ), ), ]), ), Text( '超过30分钟未支付,订单将自动取消', style: TextStyle(color: Colors.grey, fontSize: 12.0), ), SizedBox( height: 10.0, ), ], ), // 商品信息 Container( margin: EdgeInsets.only(bottom: 10.0), padding: EdgeInsets.all(10.0), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15.0), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(10), offset: Offset(0.0, 1.0), blurRadius: 1.0, spreadRadius: 0.0, ), ]), child: Column( spacing: 10.0, children: [ Row( children: [ /* Wrap( crossAxisAlignment: WrapCrossAlignment.center, spacing: 5.0, children: [ ClipOval( child: Image.asset( 'assets/images/avatar/img11.jpg', width: 25.0, ), ), Text('${orderGoodsInfo['contactUserName']}'), //contactUserName Icon( Icons.arrow_forward_ios_rounded, color: Colors.grey, size: 12.0, ), ], ),*/ Spacer(), Text( '待付款', style: TextStyle(color: Colors.red), ) ], ), Row( crossAxisAlignment: CrossAxisAlignment.start, spacing: 10.0, children: [ /* SvgPicture.asset( 'assets/images/svg/kefu.svg', height: 36.0, width: 36.0, )*/ Image.network( '${orderGoodsInfo['productInfo'][0]['pic']}', width: 80.0, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, spacing: 5.0, children: [ // Text('${orderGoodsInfo['contactUserName']}'), Text( '${orderGoodsInfo['productInfo'][0]['productName']}', maxLines: 2, overflow: TextOverflow.ellipsis, ), Row( children: [ Text( '¥${orderGoodsInfo['productInfo'][0]['salePrice']}', style: TextStyle(color: Colors.red), ), Spacer(), Text( 'x1', style: TextStyle(color: Colors.grey), ), ], ), ], ), ) ], ), ], ), ), // 订单信息 Container( margin: EdgeInsets.only(bottom: 10.0), padding: EdgeInsets.all(10.0), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15.0), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(10), offset: Offset(0.0, 1.0), blurRadius: 1.0, spreadRadius: 0.0, ), ]), child: Column( spacing: 10.0, children: [ Row( children: [ Text( '订单信息', style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold), ), Spacer(), InkWell( child: Icon( Icons.copy, color: Colors.grey, size: 14.0, ), onTap: () { MyDialog.toast('复制订单信息', icon: Icon(Icons.check_circle)); }, ) ], ), Column( spacing: 5.0, children: [ Row( children: [ Text( '订单号', style: TextStyle(color: Colors.grey), ), Spacer(), Text(orderGoodsInfo['orderId'], style: TextStyle(fontSize: 12.0)), ], ), Row( children: [ Text( '下单时间', style: TextStyle(color: Colors.grey), ), Spacer(), Text(orderGoodsInfo['createTime'], style: TextStyle(fontSize: 12.0)), ], ), Row( children: [ Text( '购买数量', style: TextStyle(color: Colors.grey), ), Spacer(), // 添加空值安全检查 Text((orderGoodsInfo['productInfo'][0]['buyNum'] ?? 0).toString(), style: TextStyle(fontSize: 12.0)), ], ), Row( children: [ Text( '订单金额', style: TextStyle(color: Colors.grey), ), Spacer(), Text('¥${orderGoodsInfo['totalAmount']??'0.00'}', style: TextStyle(fontSize: 12.0)), ], ), Row( children: [ Text( '实付金额', style: TextStyle(color: Colors.grey), ), Spacer(), Text('¥${orderGoodsInfo['payAmount']??'0.00'}', style: TextStyle(fontSize: 12.0)), ], ), ], ) ], ), ), ], ), ), // 底部固定按钮 bottomNavigationBar: SafeArea( minimum: const EdgeInsets.all(10), child: Container( height: 50.0, color: Colors.white, padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ ElevatedButton( onPressed: () {}, style: ButtonStyle( backgroundColor: WidgetStateProperty.all(Colors.white), foregroundColor: WidgetStateProperty.all(Colors.black87), ), child: const Text('取消订单'), ), const SizedBox(width: 10.0), ElevatedButton( onPressed: () { //打开微信小程序的某个页面地址,如pages/index/index Wxsdk.openMiniApp(orderId:_orderId); }, style: ButtonStyle( backgroundColor: WidgetStateProperty.all(Color(0xff07c160)), foregroundColor: WidgetStateProperty.all(Colors.white), ), child: const Text('去支付'), ), ], ), ), ), ); } }