finished tracking. But not tested enough yet

time
This commit is contained in:
Nico
2025-05-19 22:11:52 +02:00
parent fccc810b8c
commit b97f703a47
18 changed files with 263 additions and 62 deletions

View File

@@ -0,0 +1 @@
class NeedAlwaysLocation implements Exception {}

View File

@@ -3,6 +3,7 @@ import 'package:fforte/enums/databases.dart';
import 'package:fforte/screens/addCam/exceptions/location_disabled_exception.dart';
import 'package:fforte/screens/addCam/exceptions/location_forbidden_exception.dart';
import 'package:fforte/screens/addCam/services/geolocator_service.dart';
import 'package:fforte/screens/excursion/exceptions/need_always_location_exception.dart';
import 'package:fforte/screens/excursion/widgets/anzahlen.dart';
import 'package:fforte/screens/excursion/widgets/bima_nutzer.dart';
import 'package:fforte/screens/excursion/widgets/hinweise.dart';
@@ -13,6 +14,7 @@ import 'package:fforte/screens/excursion/widgets/strecke_u_spurbedingungen.dart'
import 'package:fforte/screens/excursion/widgets/tracking.dart';
import 'package:fforte/screens/helper/add_entries_dialog_helper.dart';
import 'package:fforte/screens/helper/snack_bar_helper.dart';
import 'package:fforte/screens/helper/view_entries_dialog_helper.dart';
import 'package:fforte/screens/sharedMethods/check_required.dart';
import 'package:fforte/screens/sharedMethods/save_template.dart';
import 'package:fforte/screens/sharedWidgets/datum.dart';
@@ -20,7 +22,6 @@ import 'package:fforte/screens/sharedWidgets/var_text_field.dart';
import 'package:fforte/l10n/app_localizations.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';
class ExcursionMain extends StatefulWidget {
final bool isTemplate;
@@ -120,7 +121,7 @@ class _ExcursionMainState extends State<ExcursionMain> {
@override
void initState() {
GeolocatorService.deteterminePosition()
GeolocatorService.deteterminePosition(alwaysOnNeeded: true)
.then((result) => currentPosition = result)
.catchError((error) {
if (error is LocationDisabledException) {
@@ -137,6 +138,10 @@ class _ExcursionMainState extends State<ExcursionMain> {
AppLocalizations.of(context)!.locationForbidden,
);
}
} else if (error is NeedAlwaysLocation) {
if (mounted) {
AddEntriesDialogHelper.locationSettingsDialog(context);
}
}
return currentPosition;
});
@@ -302,10 +307,7 @@ class _ExcursionMainState extends State<ExcursionMain> {
builder: (context) {
return Tracking(
weg: rmap["Weg"]!["controller"]!,
startPosition: LatLng(
currentPosition.latitude,
currentPosition.longitude,
),
startPosition: currentPosition,
);
},
),

View File

@@ -2,15 +2,17 @@ import 'dart:async';
import 'dart:math';
import 'package:fforte/l10n/app_localizations.dart';
import 'package:fforte/screens/helper/add_entries_dialog_helper.dart';
import 'package:fforte/screens/helper/snack_bar_helper.dart';
import 'package:fforte/services/notification_service.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_location_marker/flutter_map_location_marker.dart';
import 'package:geolocator/geolocator.dart';
import 'package:latlong2/latlong.dart';
class Tracking extends StatefulWidget {
final LatLng startPosition;
final Position startPosition;
final TextEditingController weg;
const Tracking({super.key, required this.startPosition, required this.weg});
@@ -21,6 +23,7 @@ class Tracking extends StatefulWidget {
class _TrackingState extends State<Tracking> {
List<LatLng> pathList = [];
StreamSubscription<Position>? positionStream;
LocationMarkerPosition? locationMarkerPosition;
bool positionStreamRunning = false;
MapController mapController = MapController();
@@ -48,6 +51,13 @@ class _TrackingState extends State<Tracking> {
);
}
}
locationMarkerPosition = LocationMarkerPosition(
latitude: widget.startPosition.latitude,
longitude: widget.startPosition.longitude,
accuracy: widget.startPosition.accuracy,
);
super.initState();
}
@@ -66,6 +76,8 @@ class _TrackingState extends State<Tracking> {
widget.weg.text += "${pos.latitude},${pos.longitude}";
}
}
NotificationService().deleteNotification();
super.dispose();
}
@@ -88,20 +100,26 @@ class _TrackingState extends State<Tracking> {
locationSettings: AndroidSettings(
accuracy: LocationAccuracy.high,
distanceFilter: 0,
// foregroundNotificationConfig:
// mounted
// ? ForegroundNotificationConfig(
// notificationTitle:
// AppLocalizations.of(context)!.trackingRunningInBackground,
// notificationText: "",
// )
// : null,
foregroundNotificationConfig:
mounted
? ForegroundNotificationConfig(
notificationTitle:
AppLocalizations.of(context)!.trackingRunningInBackground,
notificationText: "",
)
: null,
),
).listen((Position? position) {
if (position != null) {
setState(() {
pathList.add(LatLng(position.latitude, position.longitude));
// pathList.add(LatLng(rand.nextInt(5) + 40, position.longitude));
pathList.add(LatLng(position.latitude, position.longitude));
// pathList.add(LatLng(rand.nextInt(5) + 40, position.longitude));
locationMarkerPosition = LocationMarkerPosition(
latitude: position.latitude,
longitude: position.longitude,
accuracy: position.accuracy,
);
});
} else {
if (mounted) {
@@ -112,6 +130,10 @@ class _TrackingState extends State<Tracking> {
}
}
});
positionStream!.onError((e) {
NotificationService().deleteNotification();
NotificationService().showNotification(title: "ERROR: $e");
});
}
@override
@@ -121,6 +143,25 @@ class _TrackingState extends State<Tracking> {
title: Text(AppLocalizations.of(context)!.tracking),
// leading: IconButton(onPressed: () {}, icon: Icon(Icons.arrow_back_rounded)),
actions: [
if (!positionStreamRunning)
IconButton(
onPressed: () async {
bool delete =
await AddEntriesDialogHelper.deleteCompleteRouteDialog(
context,
);
if (delete) {
setState(() {
pathList = [];
});
}
},
icon: Icon(
Icons.delete,
color: Theme.of(context).colorScheme.errorContainer,
),
),
if (positionStreamRunning)
IconButton(
onPressed: () {
@@ -130,7 +171,10 @@ class _TrackingState extends State<Tracking> {
NotificationService().deleteNotification();
});
},
icon: Icon(Icons.stop_rounded),
icon: Icon(
Icons.stop_rounded,
color: Theme.of(context).colorScheme.errorContainer,
),
),
IconButton(
onPressed: () {
@@ -152,7 +196,13 @@ class _TrackingState extends State<Tracking> {
),
floatingActionButton: FloatingActionButton(
onPressed: () {
mapController.move(pathList.last, 16);
mapController.move(
LatLng(
locationMarkerPosition!.latitude,
locationMarkerPosition!.longitude,
),
16,
);
},
child: Icon(Icons.my_location),
),
@@ -165,13 +215,16 @@ class _TrackingState extends State<Tracking> {
InteractiveFlag.drag |
InteractiveFlag.pinchMove,
),
initialCenter: widget.startPosition,
initialCenter: LatLng(
widget.startPosition.latitude,
widget.startPosition.longitude,
),
initialZoom: 16.0,
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app',
userAgentPackageName: 'de.lupus.apps',
),
if (pathList.isNotEmpty)
PolylineLayer(
@@ -179,16 +232,17 @@ class _TrackingState extends State<Tracking> {
Polyline(strokeWidth: 2.0, points: pathList, color: Colors.red),
],
),
CircleLayer(
circles: [
CircleMarker(
color: Colors.blue,
point: pathList.isEmpty ? widget.startPosition : pathList.last,
radius: 5,
useRadiusInMeter: true,
),
],
),
// CircleLayer(
// circles: [
// CircleMarker(
// color: Colors.blue,
// point: pathList.isEmpty ? widget.startPosition : pathList.last,
// radius: 5,
// useRadiusInMeter: true,
// ),
// ],
// ),
CurrentLocationLayer(),
],
),
);