import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:libacflutter/Constants.dart'; import 'package:timetrack/data.dart'; class MapPage extends StatefulWidget { MapPage({super.key}); @override State createState() { return _MapPage(); } } class _MapPage extends State { MapController controller = MapController(); LatLng initialPosition = LatLng(0, 0); List PointMap = []; List Markers = []; bool autorefresh = true; @override void initState() { SessionData.Calls.MapCallback = call; super.initState(); } void call() { if (autorefresh) { didChangeDependencies(); } setState(() {}); } @override void didChangeDependencies() { PointMap = []; Markers = []; var firstPos = SessionData.positions[0]; initialPosition = LatLng(firstPos.latitude, firstPos.longitude); for (var position in SessionData.positions) { PointMap.add(LatLng(position.latitude, position.longitude)); } print("Total trips: ${SessionData.Trips.length}"); for (var trip in SessionData.Trips) { for (var dropOff in trip.deliveries) { Markers.add( Marker( point: LatLng( dropOff.endLocation!.latitude, dropOff.endLocation!.longitude, ), child: Stack( children: [ IconButton( onPressed: () { showDialog( context: context, builder: (builder) { return AlertDialog( title: Text( "Trip #${SessionData.Trips.indexOf(trip) + 1}; DropOff #${trip.deliveries.indexOf(dropOff) + 1}", ), ); }, ); }, icon: Icon( Icons.location_on_rounded, size: 24, color: Colors.red, ), ), ], ), ), ); print("Marker added"); } } setState(() {}); super.didChangeDependencies(); } @override void dispose() { SessionData.Calls.MapCallback = null; controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Time Tracker - Map View"), backgroundColor: LibACFlutterConstants.TITLEBAR_COLOR, actions: [ IconButton( onPressed: () async { didChangeDependencies(); }, icon: Icon(Icons.refresh), ), IconButton( onPressed: () { autorefresh = !autorefresh; }, icon: autorefresh ? Icon(Icons.play_disabled) : Icon(Icons.play_circle), ), ], ), body: GestureDetector( onTap: FocusScope.of(context).unfocus, child: SafeArea( child: FlutterMap( mapController: controller, options: MapOptions( minZoom: 1, maxZoom: 30, initialZoom: 15, initialCenter: initialPosition, keepAlive: false, ), children: [ TileLayer( urlTemplate: "https://tile.openstreetmap.org/{z}/{x}/{y}.png", userAgentPackageName: "dev.zontreck.timetrack", ), PolylineLayer( polylines: [ Polyline( points: PointMap, color: Colors.blue, borderStrokeWidth: 8, borderColor: Colors.blue, ), ], ), MarkerLayer(markers: Markers), RichAttributionWidget( attributions: [ TextSourceAttribution('OpenStreetMap contributors'), ], ), ], ), ), ), ); } }