2025-07-21 15:46:30 +08:00
|
|
|
|
library;
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
2025-08-26 17:38:59 +08:00
|
|
|
|
import 'package:get/get.dart';
|
2025-09-01 18:18:26 +08:00
|
|
|
|
import 'package:loopin/service/http.dart';
|
|
|
|
|
import 'package:loopin/api/shop_api.dart';
|
2025-07-21 15:46:30 +08:00
|
|
|
|
import 'package:shirne_dialog/shirne_dialog.dart';
|
2025-08-26 17:38:59 +08:00
|
|
|
|
import 'package:timer_count_down/timer_count_down.dart';
|
2025-09-01 18:18:26 +08:00
|
|
|
|
import 'package:loopin/utils/wxsdk.dart';
|
2025-07-21 15:46:30 +08:00
|
|
|
|
|
|
|
|
|
import '../../behavior/custom_scroll_behavior.dart';
|
|
|
|
|
|
|
|
|
|
class OrderDetail extends StatefulWidget {
|
|
|
|
|
const OrderDetail({super.key});
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
State<OrderDetail> createState() => _OrderDetailState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class _OrderDetailState extends State<OrderDetail> with SingleTickerProviderStateMixin {
|
2025-08-26 17:38:59 +08:00
|
|
|
|
late String _orderId;
|
2025-09-01 18:18:26 +08:00
|
|
|
|
dynamic orderGoodsInfo;
|
2025-08-26 17:38:59 +08:00
|
|
|
|
@override
|
|
|
|
|
void initState() {
|
|
|
|
|
super.initState();
|
|
|
|
|
_orderId = Get.arguments;
|
|
|
|
|
getOrderDetail(orderId: _orderId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取订单详情信息,包含商品参数
|
|
|
|
|
void getOrderDetail({required String orderId}) async {
|
2025-09-01 18:18:26 +08:00
|
|
|
|
try {
|
|
|
|
|
final res = await Http.get('${ShopApi.goodsOrderDetail}/$orderId');
|
|
|
|
|
print('订单详情-------------->${res['data']}');
|
|
|
|
|
setState(() {
|
|
|
|
|
orderGoodsInfo = res['data']; // 注意取 data 部分
|
|
|
|
|
});
|
|
|
|
|
} catch (e) {
|
|
|
|
|
Get.back();
|
|
|
|
|
}
|
2025-08-26 17:38:59 +08:00
|
|
|
|
}
|
|
|
|
|
// 计算时间
|
|
|
|
|
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;
|
|
|
|
|
}
|
2025-07-21 15:46:30 +08:00
|
|
|
|
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,
|
2025-08-26 17:38:59 +08:00
|
|
|
|
// actions: [
|
|
|
|
|
// IconButton(
|
|
|
|
|
// icon: Icon(Icons.help, size: 18.0),
|
|
|
|
|
// onPressed: () {},
|
|
|
|
|
// ),
|
|
|
|
|
// ],
|
2025-07-21 15:46:30 +08:00
|
|
|
|
),
|
|
|
|
|
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: ' 剩余 '),
|
2025-08-26 17:38:59 +08:00
|
|
|
|
// 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("倒计时结束");
|
|
|
|
|
},
|
|
|
|
|
),
|
2025-07-21 15:46:30 +08:00
|
|
|
|
),
|
|
|
|
|
]),
|
|
|
|
|
),
|
|
|
|
|
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('老白干自营旗舰店'),
|
|
|
|
|
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: [
|
|
|
|
|
Image.network(
|
|
|
|
|
'https://img13.360buyimg.com/n1/jfs/t1/263909/5/4187/123220/676eb220F3e481086/0cee829b1894fc4c.jpg',
|
|
|
|
|
width: 80.0,
|
|
|
|
|
),
|
|
|
|
|
Expanded(
|
|
|
|
|
child: Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
spacing: 5.0,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
'茅台(MOUTAI)飞天 53度 酱香型白酒 500ml*2 海外版送礼袋年货送礼',
|
|
|
|
|
maxLines: 2,
|
|
|
|
|
overflow: TextOverflow.ellipsis,
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
'¥3800',
|
|
|
|
|
style: TextStyle(color: Colors.red),
|
|
|
|
|
),
|
|
|
|
|
Spacer(),
|
|
|
|
|
Text(
|
|
|
|
|
'x10',
|
|
|
|
|
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('20250125k8ffk23j4j4318', style: TextStyle(fontSize: 12.0)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
'下单时间',
|
|
|
|
|
style: TextStyle(color: Colors.grey),
|
|
|
|
|
),
|
|
|
|
|
Spacer(),
|
|
|
|
|
Text('2025-01-25 17:00:28', style: TextStyle(fontSize: 12.0)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
'购买数量',
|
|
|
|
|
style: TextStyle(color: Colors.grey),
|
|
|
|
|
),
|
|
|
|
|
Spacer(),
|
|
|
|
|
Text('10', style: TextStyle(fontSize: 12.0)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
'订单金额',
|
|
|
|
|
style: TextStyle(color: Colors.grey),
|
|
|
|
|
),
|
|
|
|
|
Spacer(),
|
|
|
|
|
Text('¥3800', style: TextStyle(fontSize: 12.0)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
'实付金额',
|
|
|
|
|
style: TextStyle(color: Colors.grey),
|
|
|
|
|
),
|
|
|
|
|
Spacer(),
|
|
|
|
|
Text('¥38000', 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(
|
2025-09-01 18:18:26 +08:00
|
|
|
|
onPressed: () {
|
|
|
|
|
//打开微信小程序的某个页面地址,如pages/index/index
|
|
|
|
|
Wxsdk.openMiniApp(orderId:_orderId);
|
|
|
|
|
},
|
2025-07-21 15:46:30 +08:00
|
|
|
|
style: ButtonStyle(
|
|
|
|
|
backgroundColor: WidgetStateProperty.all(Color(0xff07c160)),
|
|
|
|
|
foregroundColor: WidgetStateProperty.all(Colors.white),
|
|
|
|
|
),
|
|
|
|
|
child: const Text('去支付'),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|