Files
flutter_tank_web_app/lib/widgets/gasstation_card_widget.dart

236 lines
8.3 KiB
Dart

import 'package:flutter/material.dart';
import '../models/econtrol_model.dart';
class GasStationCard extends StatelessWidget {
final EControlModel station;
final int index;
const GasStationCard({super.key, required this.station, required this.index});
Color _getPriceColor(double? price) {
if (price == null) return Colors.grey;
if (price < 1.50) return Colors.green;
if (price < 1.70) return Colors.orange;
return Colors.red;
}
String _formatDistance(double? distance) {
if (distance == null) return 'N/A';
if (distance < 1) {
return '${(distance * 1000).toStringAsFixed(0)} m';
} else {
return '${distance.toStringAsFixed(2)} km';
}
}
@override
Widget build(BuildContext context) {
final price = station.prices?.isNotEmpty == true
? station.prices!.first.amount
: null;
final priceLabel = station.prices?.isNotEmpty == true
? station.prices!.first.label
: '';
return Card(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
elevation: 4,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Colors.white, Colors.grey[50]!],
),
),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header Row with Position and Status
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: Colors.blueGrey[700],
borderRadius: BorderRadius.circular(20),
),
child: Text(
'#${index + 1}',
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 12,
),
),
),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: station.open == true
? Colors.green[400]
: Colors.red[400],
borderRadius: BorderRadius.circular(20),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
station.open == true
? Icons.check_circle
: Icons.cancel,
color: Colors.white,
size: 16,
),
const SizedBox(width: 4),
Text(
station.open == true ? 'Geöffnet' : 'Geschlossen',
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 12,
),
),
],
),
),
],
),
const SizedBox(height: 12),
// Station Name
Text(
station.name ?? 'Unbekannte Tankstelle',
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
const SizedBox(height: 8),
// Address
Row(
children: [
Icon(
Icons.location_on,
size: 16,
color: Colors.blueGrey[600],
),
const SizedBox(width: 4),
Expanded(
child: Text(
'${station.location?.address ?? ''}, '
'${station.location?.postalCode ?? ''} '
'${station.location?.city ?? ''}',
style: TextStyle(fontSize: 14, color: Colors.grey[700]),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(height: 12),
// Price and Distance Row
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// Price
if (price != null)
Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 10,
),
decoration: BoxDecoration(
color: _getPriceColor(price).withAlpha(50),
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: _getPriceColor(price),
width: 2,
),
),
child: Row(
children: [
Icon(
Icons.local_gas_station,
color: _getPriceColor(price),
size: 24,
),
const SizedBox(width: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'${price.toStringAsFixed(3)}',
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
color: _getPriceColor(price),
),
),
if (priceLabel?.isNotEmpty == true)
Text(
priceLabel!,
style: TextStyle(
fontSize: 10,
color: Colors.grey[600],
),
),
],
),
],
),
),
// Distance
Container(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 10,
),
decoration: BoxDecoration(
color: Colors.blue[50],
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
Icon(
Icons.navigation,
color: Colors.blue[700],
size: 20,
),
const SizedBox(width: 8),
Text(
_formatDistance(station.distance),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.blue[700],
),
),
],
),
),
],
),
],
),
),
),
);
}
}