谷歌地图当前用户位置 - Flutter

Has*_*eeb 3 google-maps dart flutter

我试图从谷歌地图获取用户的当前位置,但我得到了一个异常作为回报,我似乎无法理解为什么会发生这种情况。该应用程序很简单 - 获取用户的当前位置,然后将相机缩放到该位置。就是这样。

我将附上我的代码和异常消息。奇怪的是,正如您在异常消息中看到的那样,我正确地获取了 LatLng,那么为什么相机没有指向该位置呢?

class Map extends StatefulWidget {
  @override
  _MapState createState() => _MapState();
}

class _MapState extends State<Map> {

  LatLng currentLatLng;
  Completer<GoogleMapController> _controller = Completer();


  @override
  void initState(){
    super.initState();
    Geolocator.getCurrentPosition().then((currLocation){
      setState((){
        currentLatLng = new LatLng(currLocation.latitude, currLocation.longitude);
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    print("Current Location --------> " + currentLatLng.latitude.toString() + " " + currentLatLng.longitude.toString());
    return MaterialApp(
      home: new Scaffold(
        body: GoogleMap(
          mapType: MapType.normal,
          initialCameraPosition: CameraPosition(target: currentLatLng),
          onMapCreated: (GoogleMapController controller) {
            _controller.complete(controller);
          },
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

异常信息

注意 - 我正在使用 pub.dev 中的“geolocator”和“google_maps_flutter” - 所有最新版本。

Ada*_*dam 7

这就是异步编程。currentLatLng为 null 直到getCurrentPosition调用它的回调,所以你不能这样做:

initialCameraPosition: CameraPosition(target: currentLatLng)
Run Code Online (Sandbox Code Playgroud)

因为,正如您的错误所示,currentLatLng它是空的。

您的两个选择是:

  1. 将地图设置为您定义的默认位置,然后在getCurrentPosition完成时使用地图控制器更新该位置。

  2. 当为空时显示加载程序currentLatLng,当它不再为空时,显示您的地图。

这是 2 的示例

    return MaterialApp(
      home: new Scaffold(
        body: currentLatLng == null ? Center(child:CircularProgressIndicator()) : GoogleMap(
          mapType: MapType.normal,
          initialCameraPosition: CameraPosition(target: currentLatLng),
          onMapCreated: (GoogleMapController controller) {
            _controller.complete(controller);
          },
        ),
      ),
    );
Run Code Online (Sandbox Code Playgroud)