Widget _buildBusList() {
return RefreshIndicator(
onRefresh: _loadBuses,
child: ListView.builder(
padding: EdgeInsets.all(16),
itemCount: _buses.length,
itemBuilder: (ctx, index) {
final bus = _buses[index];
final statusColor = _getStatusColor(
bus.minutesUntil == 0 ? 'arriving' :
bus.minutesUntil <= 5 ? 'soon' : 'scheduled'
);
return Card(
margin: EdgeInsets.only(bottom: 12),
child: Padding(
padding: EdgeInsets.all(16),
child: Row(
children: [
// Bus Icon & Time
Container(
width: 60,
height: 60,
decoration: BoxDecoration(
color: statusColor.withOpacity(0.2),
borderRadius: BorderRadius.circular(12),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.directions_bus, color: statusColor),
Text(
bus.minutesUntil == 0 ? 'NOW' : '${bus.minutesUntil}m',
style: TextStyle(
fontWeight: FontWeight.bold,
color: statusColor,
fontSize: 12,
),
),
],
),
),
SizedBox(width: 16),
// Route Info
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
bus.routeName,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
SizedBox(height: 4),
Text(
'To: ${bus.destination}',
style: TextStyle(color: Colors.grey),
),
],
),
),
// Departure Time
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
bus.departure,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 2),
decoration: BoxDecoration(
color: statusColor.withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
),
child: Text(
bus.minutesUntil == 0 ? 'Arriving' :
bus.minutesUntil <= 5 ? 'Soon' : 'Scheduled',
style: TextStyle(
fontSize: 10,
color: statusColor,
fontWeight: FontWeight.bold,
),
),
),
],
),
],
),
),
);
},
),
);
}