mymuseum-visitapp/lib/Screens/Sections/Map/flutter_map_view.dart

137 lines
5.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:manager_api_new/api.dart';
import 'package:mymuseum_visitapp/Models/visitContext.dart';
import 'package:mymuseum_visitapp/Screens/Sections/Map/map_context.dart';
import 'package:mymuseum_visitapp/app_context.dart';
import 'package:provider/provider.dart';
import 'package:html/parser.dart' show parse;
import 'package:latlong2/latlong.dart' as ll;
class FlutterMapView extends StatefulWidget {
final MapDTO? mapDTO;
final List<GeoPointDTO> geoPoints;
final List<Map<String, dynamic>> 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<FlutterMapView> {
late List<GeoPointDTO> markersList;
late List<Marker> markers;
bool filterZoneSelected = false;
MapController? mapController;
List<Marker> 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<MapContext>(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<MapContext>(context);
final appContext = Provider.of<AppContext>(context);
VisitAppContext visitAppContext = appContext.getContext() as VisitAppContext;
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<MapContext>(
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();
},
);
}
),
)
],
);
}
}