Assistant
AssistantChatSheet.dart (+252), Helpers/assistantSuggestions.dart,
Services/assistantService.dart — même comportement et mêmes suggestions que
visitapp-web, dérivées du contenu réel.
Parcours guidés
guided_path_content_progression_page (+72), guided_path_map_progression_page (+39),
parcours_page : alignés sur les 3 questions de progression qui remplacent les
9 booléens côté manager-app.
Carte
Helpers/mapCenter.dart + les trois vues (flutter_map, google_map, map_box) et
marker_view : centrage et icônes honorés.
Fix du build
guided_step_challenge.dart:83 — typage explicite. Avec le // @dart=2.18 de
manager_api_new côté manager-app, c'est ce qui débloque flutter build apk.
flutter build apk ✅.
Reste ouvert : M3 — meterZoneGPS toujours ignoré, une constante en dur à 100 m
remplace le rayon configuré par section.
150 lines
6.0 KiB
Dart
150 lines
6.0 KiB
Dart
import 'package:mymuseum_visitapp/Helpers/mapCenter.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,;
|
|
|
|
final coords = point.geometry?.type == 'Point' && point.geometry?.coordinates is List ? point.geometry!.coordinates as List : null;
|
|
if (coords == null || coords.length < 2) return;
|
|
final lat = (coords[1] as num).toDouble();
|
|
final lon = (coords[0] as num).toDouble();
|
|
|
|
markers.add(
|
|
Marker(
|
|
width: 80.0,
|
|
height: 80.0,
|
|
point: LatLng(lat, lon),
|
|
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
|
|
}
|
|
|
|
final mapCenter = MapCenter.of(widget.mapDTO);
|
|
|
|
return Stack(
|
|
children: [
|
|
FlutterMap(
|
|
mapController: mapController,
|
|
options: MapOptions(
|
|
initialCenter: ll.LatLng(mapCenter.latitude, mapCenter.longitude),
|
|
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) {
|
|
final coords = geoPoint.geometry?.type == 'Point' && geoPoint.geometry?.coordinates is List ? geoPoint.geometry!.coordinates as List : null;
|
|
if (coords != null && coords.length >= 2) {
|
|
final lat = (coords[1] as num).toDouble();
|
|
final lon = (coords[0] as num).toDouble();
|
|
print("COUCOU IL FAUT NAVIGATE FLUTTER MAP");
|
|
mapController!.move(LatLng(lat, lon), mapController!.camera.zoom);
|
|
}
|
|
}
|
|
return SizedBox();
|
|
},
|
|
);
|
|
}
|
|
),
|
|
)
|
|
],
|
|
);
|
|
}
|
|
}
|