How To Set Initial Camera Position To The Current Device's Latitude and Longitude Using Google Maps For Flutter How To Set Initial Camera Position To The Current Device's Latitude and Longitude Using Google Maps For Flutter flutter flutter

How To Set Initial Camera Position To The Current Device's Latitude and Longitude Using Google Maps For Flutter


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

import 'package:flutter/cupertino.dart';import 'dart:async';import 'package:flutter/material.dart';import 'package:geolocator/geolocator.dart';import 'package:google_maps_flutter/google_maps_flutter.dart';class Map extends StatefulWidget {  @override  _MapState createState() => _MapState();}class _MapState extends State<Map> {  Completer<GoogleMapController> controller1;  //static LatLng _center = LatLng(-15.4630239974464, 28.363397732282127);  static LatLng _initialPosition;  final Set<Marker> _markers = {};  static  LatLng _lastMapPosition = _initialPosition;  @override  void initState() {    super.initState();    _getUserLocation();  }  void _getUserLocation() async {    Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);    List<Placemark> placemark = await Geolocator().placemarkFromCoordinates(position.latitude, position.longitude);    setState(() {      _initialPosition = LatLng(position.latitude, position.longitude);      print('${placemark[0].name}');    });  }  _onMapCreated(GoogleMapController controller) {    setState(() {      controller1.complete(controller);    });  }  MapType _currentMapType = MapType.normal;  void _onMapTypeButtonPressed() {    setState(() {      _currentMapType = _currentMapType == MapType.normal          ? MapType.satellite          : MapType.normal;    });  }  _onCameraMove(CameraPosition position) {    _lastMapPosition = position.target;  }  _onAddMarkerButtonPressed() {    setState(() {      _markers.add(          Marker(              markerId: MarkerId(_lastMapPosition.toString()),              position: _lastMapPosition,              infoWindow: InfoWindow(                  title: "Pizza Parlour",                  snippet: "This is a snippet",                  onTap: (){                  }              ),              onTap: (){              },              icon: BitmapDescriptor.defaultMarker));    });  }  Widget mapButton(Function function, Icon icon, Color color) {    return RawMaterialButton(      onPressed: function,      child: icon,      shape: new CircleBorder(),      elevation: 2.0,      fillColor: color,      padding: const EdgeInsets.all(7.0),    );  }  @override  Widget build(BuildContext context) {    return Scaffold(      body: _initialPosition == null ? Container(child: Center(child:Text('loading map..', style: TextStyle(fontFamily: 'Avenir-Medium', color: Colors.grey[400]),),),) : Container(        child: Stack(children: <Widget>[          GoogleMap(            markers: _markers,            mapType: _currentMapType,            initialCameraPosition: CameraPosition(              target: _initialPosition,              zoom: 14.4746,            ),            onMapCreated: _onMapCreated,            zoomGesturesEnabled: true,            onCameraMove: _onCameraMove,            myLocationEnabled: true,            compassEnabled: true,            myLocationButtonEnabled: false,          ),          Align(            alignment: Alignment.topRight,            child: Container(                margin: EdgeInsets.fromLTRB(0.0, 50.0, 0.0, 0.0),                child: Column(                  children: <Widget>[                    mapButton(_onAddMarkerButtonPressed,                        Icon(                            Icons.add_location                        ), Colors.blue),                    mapButton(                        _onMapTypeButtonPressed,                        Icon(                          IconData(0xf473,                              fontFamily: CupertinoIcons.iconFont,                              fontPackage: CupertinoIcons.iconFontPackage),                        ),                        Colors.green),                  ],                )),          )        ]),      ),    );  }}


GeoLocator API has been changed with latest upgraded Geolocator is no longer used. Instead GeolocatorPlatform is new keyword to access current postion as per latest updates

LatLng currentPostion;void _getUserLocation() async {        var position = await GeolocatorPlatform.instance            .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);            setState(() {          currentPostion = LatLng(position.latitude, position.longitude);        });      }

Use currentPostion in your googlemap. (define Latlag currentPosition);

GoogleMap(             // onMapCreated: _onMapCreated,             initialCameraPosition: CameraPosition(               target: currentPostion,               zoom: 10,             ),             ),   


The error you mentioned implies that you are trying to access a non-static variable inside the initializer, which is in your case currentLocation.

Since the value of currentLocation will be different for each instance of the MapState class, you are getting the above error.

Remove the static and final keywords and try setting the _currentPosition variable inside the initState function as below -

class MapState extends State<Map> {  Completer<GoogleMapController> _controller = Completer();  var currentLocation = LocationData;  var location = new Location();  CameraPosition _currentPosition;  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;    }  }  @override  void initState() {    _getLocation();    currentPosition = CameraPosition(      target: LatLng(currentLocation.latitude  ,  currentLocation.longitude),      zoom: 14.4746,    );    super.initState();  }  //Rest of the code remains same}