build method
- BuildContext context
override
Builds the UI for a single order card.
Displays the order ID, status dropdown, items, total, and expandable shipping details. Filters items to show only those belonging to the farmer.
Parameters:
- context: The BuildContext for building the widget.
Returns: A Widget representing the order card UI.
Implementation
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context, listen: false);
final farmerId = authService.currentUser!.uid;
final items = (orderData['items'] as List)
.map((item) => CartItem.fromMap(item))
.where((item) => item.farmerId == farmerId)
.toList();
final createdAt = (orderData['createdAt'] as Timestamp?)?.toDate();
final farmerTotal = items.fold<double>(
0, (sum, item) => sum + (item.price * item.quantity));
return Card(
elevation: 4,
margin: const EdgeInsets.only(bottom: 16),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Order #${orderData['orderId'].toString().substring(0, 15)}',
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
DropdownButton<String>(
value: orderData['status'],
items: [
'Pending',
'Processing',
'Shipped',
'Completed',
'Cancelled'
]
.map((status) => DropdownMenuItem(
value: status,
child: Text(
status,
style: TextStyle(
color: _getStatusColor(status),
fontWeight: FontWeight.bold,
),
),
))
.toList(),
onChanged: (newStatus) {
if (newStatus != null) {
_updateOrderStatus(context, newStatus);
}
},
),
],
),
const SizedBox(height: 8),
Text(
createdAt != null
? 'Ordered on: ${createdAt.day}/${createdAt.month}/${createdAt.year}'
: 'Order Date Unavailable',
style: const TextStyle(color: Colors.grey),
),
const Divider(height: 16),
...items.map((item) => Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
'${item.productName} x ${item.quantity}',
overflow: TextOverflow.ellipsis,
),
),
Text(
'₹${(item.price * item.quantity).toStringAsFixed(2)}'),
],
),
)),
const Divider(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Your Total',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
Text(
'₹${farmerTotal.toStringAsFixed(2)}',
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Colors.green,
fontSize: 16,
),
),
],
),
const SizedBox(height: 8),
ExpansionTile(
title: const Text('Shipping Details'),
children: [
ListTile(
title: Text(orderData['shippingDetails']['name']),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(orderData['shippingDetails']['phone']),
Text(orderData['shippingDetails']['address']),
Text(
'${orderData['shippingDetails']['city']} - ${orderData['shippingDetails']['pinCode']}'),
],
),
),
],
),
],
),
),
);
}