flutter/lib/pages/order/my_order.dart

729 lines
23 KiB
Dart
Raw Permalink Normal View History

2025-09-06 14:57:47 +08:00
/// 商家的订单
library;
import 'package:flutter/material.dart';
import 'package:get/get.dart';
2025-09-12 15:45:53 +08:00
import 'package:loopin/utils/wxsdk.dart';
2025-09-11 16:42:35 +08:00
import 'package:loopin/api/shop_api.dart';
2025-09-12 15:45:53 +08:00
import 'package:loopin/components/my_toast.dart';
2025-09-11 16:42:35 +08:00
import 'package:loopin/service/http.dart';
2025-09-06 14:57:47 +08:00
import '../../behavior/custom_scroll_behavior.dart';
2025-09-12 17:23:08 +08:00
class MyOrder extends StatefulWidget {
const MyOrder({super.key});
2025-09-06 14:57:47 +08:00
@override
2025-09-12 17:23:08 +08:00
State<MyOrder> createState() => _MyOrderState();
2025-09-06 14:57:47 +08:00
}
2025-09-12 17:23:08 +08:00
class _MyOrderState extends State<MyOrder> with SingleTickerProviderStateMixin {
2025-09-06 14:57:47 +08:00
GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();
2025-09-12 15:45:53 +08:00
// 分页内容 - 为每个Tab单独存储数据
2025-09-11 16:42:35 +08:00
final int pageSize = 10;
bool isLoadingMore = false;
bool isRefreshing = false;
2025-09-06 14:57:47 +08:00
2025-09-12 15:45:53 +08:00
// 为每个Tab单独存储状态
List<Map<String, dynamic>> _allOrders = [];
List<Map<String, dynamic>> _pendingPaymentOrders = [];
List<Map<String, dynamic>> _pendingVerificationOrders = [];
List<Map<String, dynamic>> _completedOrders = [];
List<Map<String, dynamic>> _closedOrders = [];
List<Map<String, dynamic>> _refundingOrders = [];
List<Map<String, dynamic>> _refundedOrders = [];
List<Map<String, dynamic>> _cancelledOrders = [];
// 每个Tab的分页状态
Map<int, int> _pageNums = {};
Map<int, int> _totalCounts = {};
Map<int, bool> _hasMoreData = {};
Map<int, bool> _isLoading = {};
// 订单状态0->待付款1->待核销2->已完成3->已关闭4->退款中5->已退款 6->已取消 精确匹配
2025-09-06 14:57:47 +08:00
List tabList = [
2025-09-12 15:45:53 +08:00
{'id': '', 'name': "全部", 'index': 0},
{'id': 0, 'name': "待付款", 'index': 1},
{'id': 1, 'name': "待核销", 'index': 2},
{'id': 2, 'name': "已完成", 'index': 3},
{'id': 3, 'name': "已关闭", 'index': 4},
{'id': 4, 'name': "退款中", 'index': 5},
{'id': 5, 'name': "已退款", 'index': 6},
{'id': 6, 'name': "已取消", 'index': 7}
2025-09-06 14:57:47 +08:00
];
late ScrollController scrollController = ScrollController();
late TabController tabController = TabController(initialIndex: 0, length: tabList.length, vsync: this);
@override
void initState() {
super.initState();
2025-09-12 15:45:53 +08:00
// 初始化分页状态
for (var tab in tabList) {
_pageNums[tab['index']] = 1;
_totalCounts[tab['index']] = 0;
_hasMoreData[tab['index']] = true;
_isLoading[tab['index']] = false;
}
2025-09-11 16:42:35 +08:00
// 监听滚动事件
scrollController.addListener(_scrollListener);
// 监听tab切换事件
tabController.addListener(_tabChanged);
// 获取初始订单列表
getOrderList(false);
2025-09-06 14:57:47 +08:00
}
@override
void dispose() {
2025-09-11 16:42:35 +08:00
scrollController.removeListener(_scrollListener);
2025-09-06 14:57:47 +08:00
scrollController.dispose();
2025-09-11 16:42:35 +08:00
tabController.removeListener(_tabChanged);
2025-09-06 14:57:47 +08:00
tabController.dispose();
super.dispose();
}
2025-09-12 15:45:53 +08:00
// 获取当前Tab的订单列表
List<Map<String, dynamic>> _getCurrentOrderList() {
final currentIndex = tabController.index;
switch (currentIndex) {
case 0: return _allOrders;
case 1: return _pendingPaymentOrders;
case 2: return _pendingVerificationOrders;
case 3: return _completedOrders;
case 4: return _closedOrders;
case 5: return _refundingOrders;
case 6: return _refundedOrders;
case 7: return _cancelledOrders;
default: return _allOrders;
}
}
// 设置当前Tab的订单列表
void _setCurrentOrderList(List<Map<String, dynamic>> orders, bool loadMore) {
final currentIndex = tabController.index;
setState(() {
switch (currentIndex) {
case 0:
if (loadMore) {
_allOrders.addAll(orders);
} else {
_allOrders = orders;
}
break;
case 1:
if (loadMore) {
_pendingPaymentOrders.addAll(orders);
} else {
_pendingPaymentOrders = orders;
}
break;
case 2:
if (loadMore) {
_pendingVerificationOrders.addAll(orders);
} else {
_pendingVerificationOrders = orders;
}
break;
case 3:
if (loadMore) {
_completedOrders.addAll(orders);
} else {
_completedOrders = orders;
}
break;
case 4:
if (loadMore) {
_closedOrders.addAll(orders);
} else {
_closedOrders = orders;
}
break;
case 5:
if (loadMore) {
_refundingOrders.addAll(orders);
} else {
_refundingOrders = orders;
}
break;
case 6:
if (loadMore) {
_refundedOrders.addAll(orders);
} else {
_refundedOrders = orders;
}
break;
case 7:
if (loadMore) {
_cancelledOrders.addAll(orders);
} else {
_cancelledOrders = orders;
}
break;
}
});
}
2025-09-11 16:42:35 +08:00
// 滚动监听
void _scrollListener() {
2025-09-12 15:45:53 +08:00
final currentIndex = tabController.index;
if (scrollController.position.pixels == scrollController.position.maxScrollExtent &&
!_isLoading[currentIndex]! &&
_hasMoreData[currentIndex]!) {
2025-09-11 16:42:35 +08:00
getOrderList(true);
}
}
// Tab切换监听
void _tabChanged() {
2025-09-12 15:45:53 +08:00
if (tabController.index != tabController.previousIndex) {
// 如果当前Tab没有数据则加载数据
final currentOrders = _getCurrentOrderList();
if (currentOrders.isEmpty) {
getOrderList(false);
}
2025-09-11 16:42:35 +08:00
}
}
// 获取订单列表
void getOrderList(bool loadMore) async {
2025-09-12 15:45:53 +08:00
final currentIndex = tabController.index;
final currentTab = tabList[currentIndex];
if (_isLoading[currentIndex]! || isRefreshing) return;
2025-09-11 16:42:35 +08:00
setState(() {
if (!loadMore) {
2025-09-12 15:45:53 +08:00
_pageNums[currentIndex] = 1;
2025-09-11 16:42:35 +08:00
isRefreshing = true;
} else {
2025-09-12 15:45:53 +08:00
_isLoading[currentIndex] = true;
2025-09-11 16:42:35 +08:00
}
});
try {
final status = currentTab['id'];
final res = await Http.post(ShopApi.myOrderList, data: {
2025-09-12 15:45:53 +08:00
'current': _pageNums[currentIndex], // 当前页码
2025-09-11 16:42:35 +08:00
'size': pageSize,
2025-09-12 15:45:53 +08:00
'status': status == '' ? '' : status.toString(),
2025-09-11 16:42:35 +08:00
});
if (res['code'] == 200 && res['data'] != null) {
final data = res['data'];
final List<Map<String, dynamic>> newOrders = List<Map<String, dynamic>>.from(data['records'] ?? []);
final int total = data['total'] ?? 0;
2025-09-12 15:45:53 +08:00
debugPrint(data.toString(), wrapWidth: 1024);
// 更新当前Tab的数据
_setCurrentOrderList(newOrders, loadMore);
// 更新分页状态 - 使用total总数判断
2025-09-11 16:42:35 +08:00
setState(() {
2025-09-12 15:45:53 +08:00
// 更新总数
_totalCounts[currentIndex] = total;
2025-09-11 16:42:35 +08:00
2025-09-12 15:45:53 +08:00
// 判断是否还有更多数据
final currentOrderCount = _getCurrentOrderList().length;
_hasMoreData[currentIndex] = currentOrderCount < total;
// 如果有更多数据,增加页码
if (_hasMoreData[currentIndex]!) {
_pageNums[currentIndex] = _pageNums[currentIndex]! + 1;
2025-09-11 16:42:35 +08:00
}
});
}
} catch (e) {
print('获取订单列表失败: $e');
setState(() {
2025-09-12 15:45:53 +08:00
_hasMoreData[currentIndex] = false;
2025-09-11 16:42:35 +08:00
});
} finally {
setState(() {
isRefreshing = false;
2025-09-12 15:45:53 +08:00
_isLoading[currentIndex] = false;
2025-09-11 16:42:35 +08:00
});
}
}
// 刷新数据时重置分页状态
void _refreshData() {
2025-09-12 15:45:53 +08:00
final currentIndex = tabController.index;
2025-09-11 16:42:35 +08:00
setState(() {
2025-09-12 15:45:53 +08:00
_pageNums[currentIndex] = 1;
_totalCounts[currentIndex] = 0;
_isLoading[currentIndex] = false;
_hasMoreData[currentIndex] = true;
2025-09-11 16:42:35 +08:00
});
getOrderList(false);
}
2025-09-12 15:45:53 +08:00
// 获取付款文案
String _getPaymentText(dynamic status) {
int statusCode = status is String ? int.tryParse(status) ?? 0 : (status is int ? status : 0);
switch (statusCode) {
case 0: // 待付款
return '待付款: ';
case 1: // 待核销
return '已付款: ';
case 2: // 已完成
return '实付款: ';
case 3: // 已关闭
return '订单金额: ';
case 4: // 退款中
return '实付款: ';
case 5: // 已退款
return '退款金额: ';
case 6: // 已取消
return '订单金额: ';
default:
return '金额: ';
}
}
2025-09-11 16:42:35 +08:00
// 构建订单项Widget
Widget _buildOrderItem(Map<String, dynamic> order) {
return GestureDetector(
child: 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(
children: [
Row(
children: [
Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
spacing: 5.0,
children: [
ClipOval(
child: Image.asset(
'assets/images/avatar/img11.jpg',
width: 25.0,
),
),
2025-09-12 15:45:53 +08:00
Text(order['items'][0]['tenantName'] ?? '商家名称'),
2025-09-11 16:42:35 +08:00
Icon(
Icons.arrow_forward_ios_rounded,
color: Colors.grey,
size: 12.0,
),
],
),
Spacer(),
Text(
_getStatusText(order['status']),
style: TextStyle(color: _getStatusColor(order['status'])),
)
],
),
SizedBox(height: 10),
// 商品信息
if (order['items'] != null && order['items'].isNotEmpty)
...order['items'].map<Widget>((item) => Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 80.0,
height: 80.0,
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(4.0),
),
2025-09-12 15:45:53 +08:00
child: order['items'][0]['pic'] != null && order['items'][0]['pic'].isNotEmpty
2025-09-11 16:42:35 +08:00
? Image.network(
2025-09-12 15:45:53 +08:00
order['items'][0]['pic'],
2025-09-11 16:42:35 +08:00
width: 80.0,
height: 80.0,
fit: BoxFit.cover,
)
: Icon(
Icons.shopping_bag_outlined,
size: 40.0,
color: Colors.grey[400],
),
),
SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item['productName'] ?? '商品名称',
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 14),
),
SizedBox(height: 5),
Row(
children: [
Text(
2025-09-12 15:45:53 +08:00
'¥${item['salePrice'] ?? '0'}',
2025-09-11 16:42:35 +08:00
style: TextStyle(color: Colors.red, fontSize: 16),
),
Spacer(),
Text(
'x${item['quantity'] ?? '1'}',
style: TextStyle(color: Colors.grey),
),
],
),
],
),
)
],
)).toList(),
SizedBox(height: 10),
// 金额信息
Container(
padding: EdgeInsets.all(5.0),
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: BorderRadius.circular(5.0),
),
child: Row(
children: [
Spacer(),
Text.rich(
TextSpan(children: [
2025-09-12 15:45:53 +08:00
TextSpan(text: _getPaymentText(order['status'])), // 根据状态获取文案
2025-09-11 16:42:35 +08:00
TextSpan(
text: '¥${order['totalAmount'] ?? '0'}',
style: TextStyle(color: Colors.red, fontSize: 16),
),
]),
),
],
),
),
SizedBox(height: 10),
// 根据状态显示不同的按钮
2025-09-12 15:45:53 +08:00
_buildActionButtons(order),
2025-09-11 16:42:35 +08:00
],
),
),
onTap: () {
Get.toNamed('/order/detail', arguments: {'orderId': order['id']});
},
);
}
// 获取状态文本
String _getStatusText(dynamic status) {
// 处理字符串或数字类型的状态
int statusCode = status is String ? int.tryParse(status) ?? 0 : (status is int ? status : 0);
switch (statusCode) {
2025-09-12 15:45:53 +08:00
case 0:
2025-09-11 16:42:35 +08:00
return '待付款';
2025-09-12 15:45:53 +08:00
case 1:
2025-09-11 16:42:35 +08:00
return '待核销';
2025-09-12 15:45:53 +08:00
case 2:
2025-09-11 16:42:35 +08:00
return '已完成';
2025-09-12 15:45:53 +08:00
case 3:
return '已关闭';
2025-09-11 16:42:35 +08:00
case 4:
2025-09-12 15:45:53 +08:00
return '退款中';
2025-09-11 16:42:35 +08:00
case 5:
2025-09-12 15:45:53 +08:00
return '已退款';
case 6:
2025-09-11 16:42:35 +08:00
return '已取消';
default:
return '未知状态';
}
}
// 获取状态颜色
Color _getStatusColor(dynamic status) {
int statusCode = status is String ? int.tryParse(status) ?? 0 : (status is int ? status : 0);
switch (statusCode) {
2025-09-12 15:45:53 +08:00
case 0:
return Colors.grey;
2025-09-11 16:42:35 +08:00
case 1:
return Colors.blue;
2025-09-12 15:45:53 +08:00
case 2:
2025-09-11 16:42:35 +08:00
return Colors.green;
2025-09-12 15:45:53 +08:00
case 3:
2025-09-11 16:42:35 +08:00
return Colors.red;
2025-09-12 15:45:53 +08:00
case 4:
return Colors.orange;
2025-09-11 16:42:35 +08:00
case 5:
return Colors.grey;
2025-09-12 15:45:53 +08:00
case 6:
return Colors.grey;
2025-09-11 16:42:35 +08:00
default:
return Colors.black;
}
}
// 构建操作按钮
2025-09-12 15:45:53 +08:00
Widget _buildActionButtons(dynamic orderObject) {
2025-09-11 16:42:35 +08:00
// 处理字符串或数字类型的状态
2025-09-12 15:45:53 +08:00
var status = orderObject['status'];
var orderId = orderObject['id'];
2025-09-11 16:42:35 +08:00
int statusCode = status is String ? int.tryParse(status) ?? 0 : (status is int ? status : 0);
switch (statusCode) {
2025-09-12 15:45:53 +08:00
case 0: // 待付款
2025-09-11 16:42:35 +08:00
return Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
ElevatedButton(
2025-09-12 15:45:53 +08:00
onPressed: () => _cancelOrder(orderId),
2025-09-11 16:42:35 +08:00
style: ButtonStyle(backgroundColor: WidgetStateProperty.all(Colors.white)),
child: Text('取消订单'),
),
SizedBox(width: 10),
ElevatedButton(
2025-09-12 15:45:53 +08:00
onPressed: () => _payOrder(orderId),
2025-09-11 16:42:35 +08:00
style: ButtonStyle(
backgroundColor: WidgetStateProperty.all(Color(0xff07c160)),
foregroundColor: WidgetStateProperty.all(Colors.white),
),
child: Text('去支付'),
),
],
);
2025-09-12 15:45:53 +08:00
case 1: // 待核销
2025-09-11 16:42:35 +08:00
return Row(
mainAxisAlignment: MainAxisAlignment.end,
);
2025-09-12 15:45:53 +08:00
case 2: // 已完成
2025-09-11 16:42:35 +08:00
return Row(
mainAxisAlignment: MainAxisAlignment.end,
);
default:
return SizedBox.shrink();
}
}
// 订单操作的方法
2025-09-12 15:45:53 +08:00
void _cancelOrder(String orderId) async {
try {
final res = await Http.post('${ShopApi.cancelGoodsOrder}/$orderId');
print('取消订单成功-------------->${res}');
if (res['code'] == 200) {
MyToast().tip(
title: '订单已取消',
position: 'center',
type: 'success',
);
// 刷新所有相关的tab
_refreshAllRelatedTabs();
}
} catch (e) {
print('取消订单失败-------------->${e}');
}
2025-09-11 16:42:35 +08:00
}
2025-09-12 15:45:53 +08:00
// 刷新所有相关的tab
void _refreshAllRelatedTabs() {
// 需要刷新的tab索引全部(0)、待付款(1)、已取消(7)
List<int> tabsToRefresh = [0, 1, 7];
for (int tabIndex in tabsToRefresh) {
_resetTabData(tabIndex);
// 如果当前正在查看这个tab立即刷新数据
if (tabController.index == tabIndex) {
getOrderList(false);
}
}
2025-09-11 16:42:35 +08:00
}
2025-09-12 15:45:53 +08:00
void _payOrder(_orderId) {
// 打开微信小程序的某个页面地址如pages/index/index
Wxsdk.openMiniApp(orderId: _orderId);
2025-09-11 16:42:35 +08:00
}
2025-09-12 15:45:53 +08:00
// 重置指定tab的数据
void _resetTabData(int index) {
setState(() {
_pageNums[index] = 1;
_totalCounts[index] = 0;
_isLoading[index] = false;
_hasMoreData[index] = true;
switch (index) {
case 0: _allOrders = []; break;
case 1: _pendingPaymentOrders = []; break;
case 2: _pendingVerificationOrders = []; break;
case 3: _completedOrders = []; break;
case 4: _closedOrders = []; break;
case 5: _refundingOrders = []; break;
case 6: _refundedOrders = []; break;
case 7: _cancelledOrders = []; break;
}
});
2025-09-11 16:42:35 +08:00
}
2025-09-06 14:57:47 +08:00
@override
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldKey,
backgroundColor: Colors.white,
appBar: AppBar(
titleSpacing: 1.0,
title: Text(
2025-09-12 15:45:53 +08:00
'我的订单',
2025-09-06 14:57:47 +08:00
style: TextStyle(fontSize: 18),
),
bottom: PreferredSize(
preferredSize: Size.fromHeight(45.0),
2025-09-12 15:45:53 +08:00
child: Container(
height: 45.0,
alignment: Alignment.centerLeft,
2025-09-06 14:57:47 +08:00
child: TabBar(
controller: tabController,
2025-09-12 15:45:53 +08:00
tabAlignment: TabAlignment.start,
isScrollable: true,
padding: EdgeInsets.only(left: 0),
indicatorPadding: EdgeInsets.zero,
labelPadding: EdgeInsets.symmetric(horizontal: 10.0),
2025-09-06 14:57:47 +08:00
tabs: tabList
.map((item) => Container(
2025-09-12 15:45:53 +08:00
constraints: BoxConstraints(minWidth: 70),
2025-09-06 14:57:47 +08:00
alignment: Alignment.center,
child: Badge.count(
backgroundColor: Colors.red,
offset: Offset(14, -4),
count: item['badge'] ?? 0,
2025-09-12 15:45:53 +08:00
isLabelVisible: item['badge'] != null && item['badge'] > 0,
2025-09-06 14:57:47 +08:00
child: Text(
item['name'],
style: TextStyle(fontSize: 16),
overflow: TextOverflow.ellipsis,
),
),
))
.toList(),
2025-09-12 15:45:53 +08:00
overlayColor: WidgetStateProperty.all(Colors.transparent),
unselectedLabelColor: Colors.black87,
labelColor: Color(0xFFFF5000),
indicator: UnderlineTabIndicator(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide(color: Color(0xFFFF5000), width: 2.0),
),
indicatorSize: TabBarIndicatorSize.label,
unselectedLabelStyle: TextStyle(fontSize: 16.0, fontFamily: 'Microsoft YaHei'),
labelStyle: TextStyle(fontSize: 16.0, fontFamily: 'Microsoft YaHei', fontWeight: FontWeight.w700),
dividerHeight: 0,
),
),
2025-09-06 14:57:47 +08:00
),
),
2025-09-11 16:42:35 +08:00
body: TabBarView(
controller: tabController,
children: List.generate(tabList.length, (index) {
return RefreshIndicator(
onRefresh: () async {
_refreshData();
},
child: ScrollConfiguration(
behavior: CustomScrollBehavior().copyWith(scrollbars: false),
child: Container(
color: Colors.grey[50],
2025-09-12 15:45:53 +08:00
child: Builder(
builder: (context) {
final currentOrders = _getOrderListByIndex(index);
final isLoading = _isLoading[index] ?? false;
final hasMoreData = _hasMoreData[index] ?? false;
return currentOrders.isEmpty && !isRefreshing
? emptyTip()
: ListView.builder(
controller: scrollController,
physics: AlwaysScrollableScrollPhysics(),
padding: EdgeInsets.all(10.0),
itemCount: currentOrders.length + (hasMoreData ? 1 : 0),
itemBuilder: (context, itemIndex) {
if (itemIndex == currentOrders.length) {
return _buildLoadMoreIndicator(isLoading);
}
return _buildOrderItem(currentOrders[itemIndex]);
},
);
}
),
2025-09-06 14:57:47 +08:00
),
2025-09-11 16:42:35 +08:00
),
);
}),
2025-09-06 14:57:47 +08:00
),
2025-09-13 16:14:27 +08:00
2025-09-06 14:57:47 +08:00
);
}
2025-09-12 15:45:53 +08:00
// 根据索引获取订单列表
List<Map<String, dynamic>> _getOrderListByIndex(int index) {
switch (index) {
case 0: return _allOrders;
case 1: return _pendingPaymentOrders;
case 2: return _pendingVerificationOrders;
case 3: return _completedOrders;
case 4: return _closedOrders;
case 5: return _refundingOrders;
case 6: return _refundedOrders;
case 7: return _cancelledOrders;
default: return _allOrders;
}
}
2025-09-11 16:42:35 +08:00
// 加载更多指示器
2025-09-12 15:45:53 +08:00
Widget _buildLoadMoreIndicator(bool isLoading) {
2025-09-11 16:42:35 +08:00
return Padding(
padding: EdgeInsets.symmetric(vertical: 15.0),
child: Center(
2025-09-12 15:45:53 +08:00
child: isLoading
2025-09-11 16:42:35 +08:00
? Row(
mainAxisAlignment: MainAxisAlignment.center,
2025-09-06 14:57:47 +08:00
children: [
2025-09-11 16:42:35 +08:00
SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(strokeWidth: 2),
2025-09-06 14:57:47 +08:00
),
2025-09-11 16:42:35 +08:00
SizedBox(width: 10),
Text('加载中...', style: TextStyle(color: Colors.grey)),
2025-09-06 14:57:47 +08:00
],
2025-09-11 16:42:35 +08:00
)
: Text('没有更多数据了', style: TextStyle(color: Colors.grey)),
2025-09-06 14:57:47 +08:00
),
2025-09-11 16:42:35 +08:00
);
}
2025-09-06 14:57:47 +08:00
2025-09-11 16:42:35 +08:00
Widget emptyTip() {
return Container(
2025-09-12 15:45:53 +08:00
width: double.infinity,
2025-09-11 16:42:35 +08:00
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/images/empty.png',
width: 100.0,
2025-09-06 14:57:47 +08:00
),
2025-09-11 16:42:35 +08:00
SizedBox(height: 10),
Text(
'还没有相关订单~',
style: TextStyle(color: Colors.grey, fontSize: 12.0),
)
],
2025-09-06 14:57:47 +08:00
),
2025-09-11 16:42:35 +08:00
);
}
}