tablet-app/lib/Screens/Map/google_map_view.dart

153 lines
4.8 KiB
Dart

import 'dart:async';
import 'dart:typed_data';
import 'package:enum_to_string/enum_to_string.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:manager_api/api.dart';
import 'package:provider/provider.dart';
import 'package:tablet_app/Models/map-marker.dart';
import 'package:tablet_app/Screens/Map/map_context.dart';
class GoogleMapView extends StatefulWidget {
final MapDTO? mapDTO;
final Uint8List? selectedMarkerIcon;
final String? language;
const GoogleMapView({
Key? key,
this.mapDTO,
this.selectedMarkerIcon,
this.language,
}) : super(key: key);
@override
_GoogleMapViewState createState() => _GoogleMapViewState();
}
class _GoogleMapViewState extends State<GoogleMapView> {
ConfigurationDTO? configurationDTO;
Completer<GoogleMapController> _controller = Completer();
Set<Marker> markers = {};
List<MapMarker> markersList = [];
Set<Marker> getMarkers(language, mapContext) {
markers = {};
widget.mapDTO!.points!.forEach((point) {
var mapMarker = new MapMarker(
id: point.id,
title: point.title!.firstWhere((translation) => translation.language == language).value,
description: point.description!.firstWhere((translation) => translation.language == language).value,
longitude: point.longitude,
latitude: point.latitude,
images: point.images
);
markersList.add(mapMarker);
});
markersList.forEach((element) {
if (element.latitude != null && element.longitude != null) {
markers.add(Marker(
draggable: false,
markerId: MarkerId(element.latitude! + element.longitude!),
position: LatLng(
double.tryParse(element.latitude!)!,
double.tryParse(element.longitude!)!,
),
icon: widget.selectedMarkerIcon != null ? BitmapDescriptor.fromBytes(widget.selectedMarkerIcon!) : BitmapDescriptor.defaultMarker,
/*icon: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueYellow,
),*/
onTap: () {
//setState(() {
mapContext.setSelectedMarker(
new MapMarker(
title: element.title,
images: element.images,
description: element.description,
longitude: element.longitude,
latitude: element.latitude,
));
//});
},
infoWindow: kIsWeb ? InfoWindow.noText : InfoWindow(title: element.title)));
}
});
return markers;
}
@override
void initState() {
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
@override
Widget build(BuildContext context) {
final mapContext = Provider.of<MapContext>(context);
//Size size = MediaQuery.of(context).size;
//MapTypeApp? mapTypeApp = MapTypeApp.fromJson(widget.mapDTO!.mapType!.value);
//print(mapTypeApp.toString());
MapType type = MapType.hybrid;
if(widget.mapDTO!.mapType != null) {
switch(widget.mapDTO!.mapType!.value) {
case 0:
type = MapType.none;
break;
case 1:
type = MapType.normal;
break;
case 2:
type = MapType.satellite;
break;
case 3:
type = MapType.terrain;
break;
case 4:
type = MapType.hybrid;
break;
}
}
//MapType type = EnumToString.fromString(MapType.values, widget.mapDTO!.mapType.toString()) != null ? EnumToString.fromString(MapType.values, widget.mapDTO!.mapType.toString())! : MapType.hybrid;
return GoogleMap(
mapType: type,
mapToolbarEnabled: false,
initialCameraPosition: CameraPosition(
target: LatLng(50.465503, 4.865105), // MDLF 50.416639, 4.879169 / Namur 50.465503, 4.865105
zoom: widget.mapDTO!.zoom != null ? widget.mapDTO!.zoom!.toDouble() : 18,
),
onMapCreated: (GoogleMapController controller) {
if(kIsWeb) {
//_controllerWeb.complete(controller);
} else {
_controller.complete(controller);
}
},
markers: getMarkers(widget.language, mapContext),
onTap: (LatLng location) {
//setState(() {
print(location);
mapContext.setSelectedMarker(
new MapMarker(
title: '',
description: '',
images: null,
longitude: null,
latitude: null
));
// });
},
);
}
}