1import 'package:flutter/material.dart';
2import 'package:flutter_screenutil/flutter_screenutil.dart';
3import 'package:google_maps_flutter/google_maps_flutter.dart';
7import '../../../../core/UI/theme/color_palette.dart';
8import '../../../../core/UI/widgets/custom_scaffold.dart';
9import '../../models/driver_request.dart';
16 required this.stations,
20 State<StationsMapViewScreen>
createState() => _StationsMapViewScreenState();
23class _StationsMapViewScreenState
extends State<StationsMapViewScreen>
24 with SingleTickerProviderStateMixin {
34 "elementType":
"labels.icon",
42 "featureType":
"transit",
57 duration:
const Duration(milliseconds: 300),
69 final markers = <MarkerId, Marker>{};
71 for (
int i = 0; i < widget.stations.length; i++) {
72 final station = widget.stations[i];
74 final markerId = MarkerId(station.id);
76 final marker = Marker(
78 position: LatLng(station.latitude, station.longitude),
79 infoWindow: InfoWindow(
81 snippet:
'${station.quantityInLiters.toInt()}L - ${station.address}',
83 _showStationDetails(station);
94 markers[markerId] = marker;
104 final pictureRecorder = ui.PictureRecorder();
105 final canvas = Canvas(pictureRecorder);
106 final paint = Paint()
108 ..style = PaintingStyle.fill;
112 Offset(size / 2, size / 2),
119 ..
color = Colors.white
120 ..style = PaintingStyle.stroke
124 Offset(size / 2, size / 2),
130 final textPainter = TextPainter(
132 text: number.toString(),
136 fontWeight: FontWeight.bold,
139 textDirection: TextDirection.ltr,
142 textPainter.layout();
146 (size - textPainter.width) / 2,
147 (size - textPainter.height) / 2,
151 final img = await pictureRecorder.endRecording().toImage(
155 final data = await img.toByteData(format: ui.ImageByteFormat.png);
157 return BitmapDescriptor.bytes(data!.buffer.asUint8List(), height: 35.sp);
163 builder: (BuildContext context) {
165 shape: RoundedRectangleBorder(
166 borderRadius: BorderRadius.circular(16.r),
172 decoration: BoxDecoration(
174 borderRadius: BorderRadius.circular(8.r),
177 Icons.local_gas_station,
188 fontWeight: FontWeight.w600,
196 mainAxisSize: MainAxisSize.min,
197 crossAxisAlignment: CrossAxisAlignment.start,
204 'Quantity',
'${station.quantityInLiters.toInt()}L'),
207 '${station.latitude.toStringAsFixed(4)}, ${station.longitude.toStringAsFixed(4)}'),
212 onPressed: () => Navigator.of(context).pop(),
229 crossAxisAlignment: CrossAxisAlignment.start,
237 fontWeight: FontWeight.w600,
256 Widget
build(BuildContext context) {
257 LatLng initialPosition =
258 const LatLng(24.7136, 46.6753);
260 if (widget.stations.isNotEmpty) {
261 final firstStation = widget.stations.first;
262 initialPosition = LatLng(firstStation.latitude, firstStation.longitude);
265 return CustomScaffold(
266 title:
'Stations Map',
272 initialCameraPosition: CameraPosition(
273 target: initialPosition,
276 markers: Set<Marker>.of(
_markers.values),
277 onMapCreated: (GoogleMapController controller) {
278 _mapController = controller;
283 myLocationEnabled:
true,
284 myLocationButtonEnabled:
false,
285 zoomControlsEnabled:
false,
286 mapToolbarEnabled:
false,
287 compassEnabled:
true,
298 color: Colors.white.withValues(alpha: 0.7),
300 child: CircularProgressIndicator(),
308 mainAxisSize: MainAxisSize.min,
314 _mapController?.animateCamera(CameraUpdate.zoomIn());
322 _mapController?.animateCamera(CameraUpdate.zoomOut());
334 required IconData
icon,
341 decoration: BoxDecoration(
343 borderRadius: BorderRadius.circular(8.r),
346 color: Colors.black.withValues(alpha: 0.1),
348 offset:
const Offset(0, 2),
353 color: Colors.transparent,
355 borderRadius: BorderRadius.circular(8.r),
override void initState()
class App extends StatefulWidget build(BuildContext context)
static const antiFlashWhite
late AnimationController _animationController
Future< void > _createMarkers() async
Future< BitmapDescriptor > _getMarkerBitmap(int number) async
class EndLocationChooserScreen extends StatefulWidget _mapController
Widget _buildDetailRow({ required IconData icon, required String label, required String value, })
void _showStationDetails(Station station)
Widget _buildMapButton({ required IconData icon, required String tooltip, required VoidCallback onPressed, })
style Text( '${ 'scheduling.reference'.tr()}:${collection.internalCode}', style:Theme.of(context).textTheme.bodySmall,)
style SizedBox(height:2.h)
style Column(crossAxisAlignment:CrossAxisAlignment.end, children:[Container(padding:EdgeInsets.symmetric(horizontal:8.w, vertical:4.h), decoration:BoxDecoration(color:ColorPalette.tiffanyBlue.withValues(alpha:0.1), borderRadius:BorderRadius.circular(12),), child:Text(collection.type ?? '', style:Theme.of(context).textTheme.bodySmall?.copyWith(color:ColorPalette.tiffanyBlue, fontWeight:FontWeight.bold,),),),],)