I am using google maps flutter plugin for my App. I want the initial camera position target (the LatLng) to be exactly equal to the current device's latitude and longitude so that the camera on startup shows where the user currently is. However, I am running into issues trying to do this. I have tried using the Location and Geolocator packages but there is no clear cut example on how to do what I want to achieve.
When I try to use currentLocation.latitude
and currentLocation.longitude
for the Location package as the values for the Latlng in the camera target I am running into the below error.
"only static members can be accessed by initializers"
Frankly I don't know what that means in this context. I have read some examples but none clearly implements what I really want to achieve
import 'package:flutter/cupertino.dart';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
class Map extends StatefulWidget {
@override
State<Map> createState() => MapState();
}
class MapState extends State<Map> {
Completer<GoogleMapController> _controller = Completer();
var currentLocation = LocationData;
var location = new Location();
Future _getLocation() async {
try {
location.onLocationChanged().listen((LocationData currentLocation) {
print('Latitude:${currentLocation.latitude}');
print('Longitude:${currentLocation.longitude}');
return LatLng(currentLocation.latitude, currentLocation.longitude);
});
} catch (e) {
print('ERROR:$e');
currentLocation = null;
}
}
static final CameraPosition _currentPosition = CameraPosition(
target: LatLng(currentLocation.latitude , currentLocation.longitude),
zoom: 14.4746,
);
@override
void initState() {
_getLocation();
super.initState();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: GoogleMap(
mapType: MapType.normal,
initialCameraPosition: _currentPosition,
zoomGesturesEnabled: true,
myLocationButtonEnabled: true,
rotateGesturesEnabled: true,
tiltGesturesEnabled: true,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
),
);
}
}
That is my code snippet producing the error on the _currentPosition final which represents Camera position am equating it to current device's latitude and longitude using locator package but Flutter is complaining. I don't know how to do it correctly. I want the latlng target to be the latlng of the device
Best Answer
The issue concerning the error when displaying the map widget while getting the user current location is that, getting the user's actual current location is an asynchronous operation and thus the during that whole process initial position will be null thus we make a conditional that runs as we wait for the async operation to complete then display the map when then the value will be non-null. I have refactored the code and used the geolocator package instead