correcao de erros no codigo do mapa
This commit is contained in:
@@ -18,11 +18,14 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
GoogleMapController? _mapController;
|
||||
StreamSubscription<Position>? _positionStreamSubscription;
|
||||
Timer? _simulationTimer;
|
||||
|
||||
|
||||
// Controle de frequência de atualização para evitar sobrecarga e crashes
|
||||
DateTime? _lastUpdate;
|
||||
|
||||
final List<LatLng> _routePoints = [];
|
||||
final Set<Polyline> _polylines = {};
|
||||
final Set<Marker> _markers = {};
|
||||
|
||||
|
||||
LatLng? _plannedStart;
|
||||
LatLng? _plannedEnd;
|
||||
bool _isPlanningMode = false;
|
||||
@@ -44,6 +47,7 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
}
|
||||
|
||||
Future<void> _setupIconsAndTracking() async {
|
||||
// Marcadores premium: tamanho ideal para visibilidade e estética
|
||||
_startIcon = await _createPremiumMarker(Colors.greenAccent, Icons.play_arrow_rounded, 85);
|
||||
_finishIcon = await _createPremiumMarker(AppColors.coral, Icons.flag_rounded, 85);
|
||||
_arrowIcon = await _createArrowMarker(Colors.black, Colors.white, 95);
|
||||
@@ -87,6 +91,7 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
void dispose() {
|
||||
_positionStreamSubscription?.cancel();
|
||||
_simulationTimer?.cancel();
|
||||
_mapController?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -98,45 +103,48 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
permission = await Geolocator.requestPermission();
|
||||
if (permission == LocationPermission.denied) return;
|
||||
}
|
||||
Position position = await Geolocator.getCurrentPosition();
|
||||
Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.bestForNavigation);
|
||||
_currentPosition = LatLng(position.latitude, position.longitude);
|
||||
setState(() => _isLoading = false);
|
||||
_startLocationStream();
|
||||
}
|
||||
|
||||
void _startLocationStream() {
|
||||
_positionStreamSubscription = Geolocator.getPositionStream(locationSettings: const LocationSettings(accuracy: LocationAccuracy.high, distanceFilter: 5)).listen((Position position) {
|
||||
if (!_isSimulating) _updatePosition(LatLng(position.latitude, position.longitude), position.speed);
|
||||
_positionStreamSubscription = Geolocator.getPositionStream(
|
||||
locationSettings: const LocationSettings(
|
||||
accuracy: LocationAccuracy.bestForNavigation,
|
||||
distanceFilter: 0
|
||||
)
|
||||
).listen((Position position) {
|
||||
if (!_isSimulating) {
|
||||
final now = DateTime.now();
|
||||
if (_lastUpdate == null || now.difference(_lastUpdate!).inMilliseconds > 500) {
|
||||
_lastUpdate = now;
|
||||
_updatePosition(LatLng(position.latitude, position.longitude), position.speed);
|
||||
}
|
||||
}
|
||||
}, onError: (error) {
|
||||
debugPrint("Erro no GPS: $error");
|
||||
});
|
||||
}
|
||||
|
||||
void _updatePosition(LatLng newPoint, double speed) {
|
||||
if (!mounted) return;
|
||||
setState(() {
|
||||
if (_routePoints.isNotEmpty) {
|
||||
_totalDistance += Geolocator.distanceBetween(_currentPosition.latitude, _currentPosition.longitude, newPoint.latitude, newPoint.longitude);
|
||||
}
|
||||
_currentSpeed = speed;
|
||||
_currentSpeed = speed >= 0 ? speed : 0;
|
||||
_routePoints.add(newPoint);
|
||||
_currentPosition = newPoint;
|
||||
|
||||
// Update only the dynamic follower arrow
|
||||
_markers.removeWhere((m) => m.markerId.value == 'follower');
|
||||
_markers.add(Marker(
|
||||
markerId: const MarkerId('follower'),
|
||||
position: _currentPosition,
|
||||
rotation: _calculateRotation(_routePoints),
|
||||
flat: true,
|
||||
anchor: const Offset(0.5, 0.5),
|
||||
icon: _arrowIcon ?? BitmapDescriptor.defaultMarker,
|
||||
zIndex: 12,
|
||||
));
|
||||
_updateMarkers(); // Agora só atualiza a seta seguidora
|
||||
|
||||
if (_routePoints.length > 1) {
|
||||
_polylines.removeWhere((p) => p.polylineId.value == 'route' || p.polylineId.value == 'route_glow');
|
||||
_polylines.add(Polyline(
|
||||
polylineId: const PolylineId('route_glow'),
|
||||
points: List.from(_routePoints),
|
||||
color: Colors.lightBlueAccent.withOpacity(0.3),
|
||||
color: Colors.cyanAccent.withOpacity(0.3),
|
||||
width: 14,
|
||||
zIndex: 9,
|
||||
));
|
||||
@@ -151,7 +159,25 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
));
|
||||
}
|
||||
});
|
||||
_mapController?.animateCamera(CameraUpdate.newLatLng(newPoint));
|
||||
|
||||
if (_mapController != null) {
|
||||
_mapController!.animateCamera(CameraUpdate.newLatLng(newPoint));
|
||||
}
|
||||
}
|
||||
|
||||
void _updateMarkers() {
|
||||
// Remove APENAS o marcador da seta seguidora para evitar duplicidade com o ponto de partida fixo
|
||||
_markers.removeWhere((m) => m.markerId.value == 'follower');
|
||||
|
||||
_markers.add(Marker(
|
||||
markerId: const MarkerId('follower'),
|
||||
position: _currentPosition,
|
||||
rotation: _calculateRotation(_routePoints),
|
||||
flat: true,
|
||||
anchor: const Offset(0.5, 0.5),
|
||||
icon: _arrowIcon ?? BitmapDescriptor.defaultMarker,
|
||||
zIndex: 12,
|
||||
));
|
||||
}
|
||||
|
||||
double _calculateRotation(List<LatLng> points) {
|
||||
@@ -192,40 +218,28 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
_routePoints.clear();
|
||||
_polylines.removeWhere((p) => p.polylineId.value == 'route' || p.polylineId.value == 'route_glow');
|
||||
_totalDistance = 0.0;
|
||||
|
||||
// Start from planned start OR current real location
|
||||
_currentPosition = _plannedStart ?? _currentPosition;
|
||||
|
||||
// Initialize routePoints with the start so the arrow appears immediately at the start point
|
||||
_routePoints.add(_currentPosition);
|
||||
|
||||
// Update only the follower arrow. Planned markers are already in the set.
|
||||
_markers.removeWhere((m) => m.markerId.value == 'follower');
|
||||
_markers.add(Marker(
|
||||
markerId: const MarkerId('follower'),
|
||||
position: _currentPosition,
|
||||
flat: true,
|
||||
anchor: const Offset(0.5, 0.5),
|
||||
icon: _arrowIcon ?? BitmapDescriptor.defaultMarker,
|
||||
zIndex: 12,
|
||||
));
|
||||
_updateMarkers(); // Reposiciona a seta no início
|
||||
});
|
||||
|
||||
_simulationTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||
double latStep = 0.00025;
|
||||
double lngStep = 0.00025;
|
||||
_simulationTimer = Timer.periodic(const Duration(milliseconds: 100), (timer) {
|
||||
double latStep = 0.000025;
|
||||
double lngStep = 0.000025;
|
||||
|
||||
if (_plannedEnd != null) {
|
||||
double dist = Geolocator.distanceBetween(_currentPosition.latitude, _currentPosition.longitude, _plannedEnd!.latitude, _plannedEnd!.longitude);
|
||||
if (dist < 12) {
|
||||
_updatePosition(_plannedEnd!, 0.0);
|
||||
_toggleSimulation();
|
||||
return;
|
||||
if (dist < 2) {
|
||||
_updatePosition(_plannedEnd!, 0.0);
|
||||
_toggleSimulation();
|
||||
return;
|
||||
}
|
||||
latStep = (_plannedEnd!.latitude - _currentPosition.latitude) / (max(dist / 8, 1));
|
||||
lngStep = (_plannedEnd!.longitude - _currentPosition.longitude) / (max(dist / 8, 1));
|
||||
latStep = (_plannedEnd!.latitude - _currentPosition.latitude) / (max(dist / 0.8, 1));
|
||||
lngStep = (_plannedEnd!.longitude - _currentPosition.longitude) / (max(dist / 0.8, 1));
|
||||
}
|
||||
|
||||
LatLng nextPoint = LatLng(_currentPosition.latitude + latStep, _currentPosition.longitude + lngStep);
|
||||
_updatePosition(nextPoint, 3.5 + Random().nextDouble());
|
||||
_updatePosition(nextPoint, 3.5 + Random().nextDouble() * 0.5);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user