import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:manager_api/api.dart'; import 'package:provider/provider.dart'; import 'package:tablet_app/Models/tabletContext.dart'; import 'package:tablet_app/Screens/Map/map_context.dart'; import 'package:tablet_app/app_context.dart'; import 'package:html/parser.dart' show parse; import 'package:latlong2/latlong.dart' as ll; class FlutterMapView extends StatefulWidget { final MapDTO? mapDTO; final List geoPoints; final List> icons; final String? language; const FlutterMapView({ Key? key, this.mapDTO, required this.geoPoints, required this.icons, this.language, }) : super(key: key); @override _FlutterMapViewState createState() => _FlutterMapViewState(); } class _FlutterMapViewState extends State { late List markersList; late List markers; bool filterZoneSelected = false; MapController? mapController; List createPoints(mapContext) { markersList = []; markers = []; int i = 0; widget.geoPoints.forEach((point) { if (point.title!.where((translation) => translation.language == widget.language).isNotEmpty) { var textSansHTML = parse(point.title!.firstWhere((translation) => translation.language == widget.language).value); point.id = i; point.title = point.title!.where((t) => t.language == widget.language).toList(); markersList.add(point); //var icon = point.categorie == null ? BitmapDescriptor.fromBytes(widget.icons.where((i) => i['id'] == null).first['icon']) : widget.icons.any((i) => i['id'] == point.categorieId) ? BitmapDescriptor.fromBytes(widget.icons.where((i) => i['id'] == point.categorieId).first['icon']) : BitmapDescriptor.fromBytes(widget.icons.where((i) => i['id'] == null).first['icon']); //widget.selectedMarkerIcon,; markers.add( Marker( width: 80.0, height: 80.0, point: LatLng(double.tryParse(point.latitude!)!, double.tryParse(point.longitude!)!), child: GestureDetector( onTap: () { /*final mapContext = Provider.of(context, listen: false); mapContext.setSelectedPoint(point); mapContext.setSelectedPointForNavigate(point);*/ mapContext.setSelectedPoint(point); //mapContext.setSelectedPointForNavigate(point); }, child: widget.icons.firstWhere((i) => i['id'] == point.categorieId, orElse: () => widget.icons.first)['icon'] != null ? Image.memory(widget.icons.firstWhere((i) => i['id'] == point.categorieId, orElse: () => widget.icons.first)['icon']) : Icon(Icons.pin_drop, color: Colors.red),//widget.icons.firstWhere((i) => i['id'] == point.categorieId, orElse: () => widget.icons.first)['icon'], ) ), ); i++; } }); return markers; } @override void initState() { super.initState(); } @override Widget build(BuildContext context) { final mapContext = Provider.of(context); final appContext = Provider.of(context); TabletAppContext tabletAppContext = appContext.getContext() as TabletAppContext; markers = createPoints(mapContext); if (mapController == null) { // mapContext.getSelectedPointForNavigate() != null /*var geoPoint = mapContext.getSelectedPointForNavigate(); var center = LatLng(double.tryParse(geoPoint.latitude!)!, double.tryParse(geoPoint.longitude!)!);*/ mapController = MapController(); //mapController!.move(center, widget.mapDTO!.zoom != null ? widget.mapDTO!.zoom!.toDouble() : 12); mapContext.setSelectedPointForNavigate(null); // Reset after navigation } return Stack( children: [ FlutterMap( mapController: mapController, options: MapOptions( initialCenter: widget.mapDTO!.longitude != null && widget.mapDTO!.latitude != null ? ll.LatLng(double.tryParse(widget.mapDTO!.latitude!)!, double.tryParse(widget.mapDTO!.longitude!)!) : ll.LatLng(4.865105, 50.465503), //.toJson() initialZoom: widget.mapDTO!.zoom != null ? widget.mapDTO!.zoom!.toDouble() : 12, onTap: (Tap, lnt) => { mapContext.setSelectedPointForNavigate(null), mapContext.setSelectedPoint(null), } ), children: [ TileLayer( urlTemplate: "https://mt1.google.com/vt/lyrs=m&x={x}&y={y}&z={z}", userAgentPackageName: 'be.unov.myinfomate.tablet', ), MarkerLayer( markers: markers ), ], ), Container( child: Builder( builder: (context) { return Consumer( builder: (context, mapContext, _) { var geoPoint = mapContext.getSelectedPointForNavigate() as GeoPointDTO?; if (geoPoint != null && mapController != null) { print("COUCOU IL FAUT NAVIGATE FLUTTER MAP"); mapController!.move(LatLng(double.tryParse(geoPoint.latitude!)!, double.tryParse(geoPoint.longitude!)!), mapController!.camera.zoom/*, widget.mapDTO!.zoom != null ? widget.mapDTO!.zoom!.toDouble() : 16*/); // keep actual zoom } return SizedBox(); }, ); } ), ) ], ); } }