Reputation: 539
hello I'm getting this exception from the code below this application is running with those packages:-
Location:^5.0.1
google_maps_flutter:^2.3.1
flutter_polyline_points:^1.0.0
location: ^5.0.1
exception (method_channel_location.dart
):-
Exception has occurred.
_TypeError (type '_Map<Object?, Object?>' is not a subtype of type 'Map<String, dynamic>' in type cast)
code(the function below is responsible on navigation):-
getNavigation() async {
bool _serviceEnabled;
PermissionStatus _permissionGranted;
final GoogleMapController? controller = await _controller.future;
location.changeSettings(accuracy: loc.LocationAccuracy.high);
_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
_serviceEnabled = await location.requestService();
if (!_serviceEnabled) {
return;
}
}
_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
_permissionGranted = await location.requestPermission();
if (_permissionGranted != PermissionStatus.granted) {
return;
}
}
if (_permissionGranted == loc.PermissionStatus.granted) {
_currentPosition = await location.getLocation();
curLocation =
LatLng(_currentPosition!.latitude!, _currentPosition!.longitude!);
locationSubscription =
location.onLocationChanged.listen((LocationData currentLocation) {
controller?.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
target: LatLng(currentLocation.latitude!, currentLocation.longitude!),
zoom: 16,
)));
if (mounted) {
controller
?.showMarkerInfoWindow(MarkerId(sourcePosition!.markerId.value));
setState(() {
curLocation =
LatLng(currentLocation.latitude!, currentLocation.longitude!);
sourcePosition = Marker(
markerId: MarkerId(currentLocation.toString()),
icon: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueBlue),
position:
LatLng(currentLocation.latitude!, currentLocation.longitude!),
infoWindow: InfoWindow(
title:
'${double.parse((getDistance(LatLng(widget.lat, widget.lang)).toStringAsFixed(2)))} km'),
onTap: () {
print('market tapped');
},
);
});
getDirections(LatLng(widget.lat, widget.lang));
}
});
}
}
Even though the full code is:-
import 'dart:async';
import 'package:applicationservice/main.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'package:location/location.dart' as loc;
import 'dart:math' show cos, sqrt, asin;
import 'package:url_launcher/url_launcher.dart';
class MainScreen extends StatefulWidget {
final double lat;
final double lang;
// const MainScreen({super.key, required this.lat, required this.lang});
MainScreen(this.lat, this.lang);
@override
State<MainScreen> createState() => _MainScreenState();
}
const String google_api_key = "AIzaSyAnpCS9K.......kabKsMAZzsQ";
class _MainScreenState extends State<MainScreen> {
final Completer<GoogleMapController> _controller = Completer();
Map<PolylineId, Polyline> polylines = {};
PolylinePoints polylinePoints = PolylinePoints();
Location location = Location();
Marker? sourcePosition, destinationPosition;
loc.LocationData? _currentPosition;
LatLng curLocation = LatLng(32.8945, 13.1807);
StreamSubscription<loc.LocationData>? locationSubscription;
// تحديث الموقع
@override
void initState() {
super.initState();
addMarker();
getNavigation();
}
@override
void dispose() {
locationSubscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: sourcePosition == null
? Center(child: CircularProgressIndicator())
: Stack(
children: [
GoogleMap(
zoomControlsEnabled: false,
polylines: Set<Polyline>.of(polylines.values),
initialCameraPosition: CameraPosition(
target: curLocation,
zoom: 16,
),
markers: {sourcePosition!, destinationPosition!},
onTap: (latLng) {
print(latLng);
},
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
),
Positioned(
top: 30,
left: 15,
child: GestureDetector(
onTap: () {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => MyApp()),
(route) => false);
},
child: Icon(Icons.arrow_back),
),
),
Positioned(
bottom: 10,
right: 10,
child: Container(
width: 50,
height: 50,
decoration: BoxDecoration(
shape: BoxShape.circle, color: Colors.blue),
child: Center(
child: IconButton(
icon: Icon(
Icons.navigation_outlined,
color: Colors.white,
),
onPressed: () async {
await launchUrl(Uri.parse(
'google.navigation:q=${widget.lat},${widget.lang}&key=AIzaSyAnpCS9K8F......pZNb_kabKsMAZzsQ'));
},
)),
),
)
],
));
}
getNavigation() async {
bool _serviceEnabled;
PermissionStatus _permissionGranted;
final GoogleMapController? controller = await _controller.future;
location.changeSettings(accuracy: loc.LocationAccuracy.high);
_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
_serviceEnabled = await location.requestService();
if (!_serviceEnabled) {
return;
}
}
_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
_permissionGranted = await location.requestPermission();
if (_permissionGranted != PermissionStatus.granted) {
return;
}
}
if (_permissionGranted == loc.PermissionStatus.granted) {
_currentPosition = await location.getLocation();
curLocation =
LatLng(_currentPosition!.latitude!, _currentPosition!.longitude!);
locationSubscription =
location.onLocationChanged.listen((LocationData currentLocation) {
controller?.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
target: LatLng(currentLocation.latitude!, currentLocation.longitude!),
zoom: 16,
)));
if (mounted) {
controller
?.showMarkerInfoWindow(MarkerId(sourcePosition!.markerId.value));
setState(() {
curLocation =
LatLng(currentLocation.latitude!, currentLocation.longitude!);
sourcePosition = Marker(
markerId: MarkerId(currentLocation.toString()),
icon: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueBlue),
position:
LatLng(currentLocation.latitude!, currentLocation.longitude!),
infoWindow: InfoWindow(
title:
'${double.parse((getDistance(LatLng(widget.lat, widget.lang)).toStringAsFixed(2)))} km'),
onTap: () {
print('market tapped');
},
);
});
getDirections(LatLng(widget.lat, widget.lang));
}
});
}
}
getDirections(LatLng dst) async {
List<LatLng> polylineCoordinates = [];
List<dynamic> points = [];
PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
google_api_key,
PointLatLng(curLocation.latitude, curLocation.longitude),
PointLatLng(dst.latitude, dst.longitude),
travelMode: TravelMode.driving);
if (result.points.isNotEmpty) {
result.points.forEach((PointLatLng point) {
polylineCoordinates.add(LatLng(point.latitude, point.longitude));
points.add({'lat': point.latitude, 'lng': point.longitude});
});
} else {
print(result.errorMessage);
}
addPolyLine(polylineCoordinates);
}
addPolyLine(List<LatLng> polylineCoordinates) {
PolylineId id = PolylineId('poly');
Polyline polyline = Polyline(
polylineId: id,
color: Colors.blue,
points: polylineCoordinates,
width: 5,
);
polylines[id] = polyline;
setState(() {});
}
double calculateDistance(lat1, lon1, lat2, lon2) {
var p = 0.017453292519943295;
var c = cos;
var a = 0.5 -
c((lat2 - lat1) * p) / 2 +
c(lat1 * p) * c(lat2 * p) * (1 - c((lon2 - lon1) * p)) / 2;
return 12742 * asin(sqrt(a));
}
double getDistance(LatLng destposition) {
return calculateDistance(curLocation.latitude, curLocation.longitude,
destposition.latitude, destposition.longitude);
}
addMarker() {
setState(() {
sourcePosition = Marker(
markerId: MarkerId('source'),
position: curLocation,
icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueAzure),
);
destinationPosition = Marker(
markerId: MarkerId('destination'),
position: LatLng(widget.lat, widget.lang),
icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueCyan),
);
});
}
}
your help is very appreciated, thanks.
Upvotes: 0
Views: 62
Reputation: 1175
Replace
polylines[id] = polyline;
with
polylines.update(id, (value) => polyline, ifAbsent: () => polyline);
Upvotes: 0