Google maps 谷歌地图相机在颤振中的位置更新问题

Google maps 谷歌地图相机在颤振中的位置更新问题,google-maps,flutter,google-maps-flutter,Google Maps,Flutter,Google Maps Flutter,我正在构建一个基于地图的颤振应用程序。所以我使用谷歌地图软件包,一切正常。但是,我尝试添加一个FloatingActionButton,以在我的位置上重新居中显示地图,在这里,我遇到了一个问题。首先,地图没有在我的位置重新居中,第二,我得到一个可怕的红色错误。下面是代码、颤振医生和错误代码 我的代码: import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.da

我正在构建一个基于地图的颤振应用程序。所以我使用谷歌地图软件包,一切正常。但是,我尝试添加一个FloatingActionButton,以在我的位置上重新居中显示地图,在这里,我遇到了一个问题。首先,地图没有在我的位置重新居中,第二,我得到一个可怕的红色错误。下面是代码、颤振医生和错误代码

我的代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'package:spotycar/providers/location_service.dart';

import '../../models/user_location.dart';

class MapWidget extends StatefulWidget {
  MapWidget({@required Key key}) : super(key: key);

  @override
  _MapWidgetState createState() => _MapWidgetState();
}

var locationClicked = false;

class _MapWidgetState extends State<MapWidget> {
  @override
  Widget build(BuildContext context) {
    CameraUpdate cameraUpdate;
    GoogleMapController mapController;
    var location = Provider.of<UserLocation>(context);
    final provider = Provider.of<LocationService>(context);
    final double _zoom = 17.0;
    final double _tilt = 37.0;
    var _coord;

    if (provider.loadedLocation) {
      _coord = LatLng(location.latitude, location.longitude);
      cameraUpdate = CameraUpdate.newCameraPosition(CameraPosition(
        target: _coord,
        bearing: location.heading,
        zoom: _zoom,
        tilt: _tilt,
      ));
    }

    if (locationClicked == true) {
      mapController.moveCamera(
        CameraUpdate.newCameraPosition(
          CameraPosition(
            target: _coord,
            bearing: location.heading,
            zoom: _zoom,
            tilt: _tilt,
          ),
        ),
      );
      setState(() {
        locationClicked = false;
      });
    }

    return Scaffold(
      body: !provider.loadedLocation
          ? Center(
              child: CircularProgressIndicator(
                valueColor: AlwaysStoppedAnimation<Color>(Colors.purple),
              ),
            )
          : GoogleMap(
              onMapCreated: (GoogleMapController controller) {
                mapController = controller;
                mapController.animateCamera(cameraUpdate);
              },
              myLocationEnabled: true,
              myLocationButtonEnabled: false,
              zoomControlsEnabled: false,
              initialCameraPosition: CameraPosition(
                target: _coord,
                zoom: _zoom,
                tilt: _tilt,
              ),
              rotateGesturesEnabled: true,
            ),
    );
  }
}

class LocationRechercheWidget extends StatefulWidget {
  @override
  _LocationRechercheWidgetState createState() =>
      _LocationRechercheWidgetState();
}

class _LocationRechercheWidgetState extends State<LocationRechercheWidget> {
  @override
  Widget build(BuildContext context) {
    return FloatingActionButton(
      child: Icon(
        Icons.location_searching,
        color: Colors.purple,
        size: 25,
      ),
      backgroundColor: Colors.white,
      onPressed: () {
        setState(() {
          locationClicked = true;
        });
      },
    );
  }
}
当我点击FloatingAction按钮时,我得到的错误是:

═╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building MapWidget-[#2721f](dirty, dependencies:
[InheritedProvider<UserLocation>, InheritedProvider<LocationService>], state:
_MapWidgetState#50617):
The method 'moveCamera' was called on null.
Receiver: null
Tried calling: moveCamera(Instance of 'CameraUpdate')
The relevant error-causing widget was:
  MapWidget-[#2721f]
  
lib\screen\map_screen.dart:20
When the exception was thrown, this was the stack:
#0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:51:5)
#1      _MapWidgetState.build 
package:spotycar/…/map_screen/map_widget.dart:39
#2      StatefulElement.build 
package:flutter/…/widgets/framework.dart:4663
#3      ComponentElement.performRebuild 
package:flutter/…/widgets/framework.dart:4546
#4      StatefulElement.performRebuild 
package:flutter/…/widgets/framework.dart:4719
#5      Element.rebuild 
package:flutter/…/widgets/framework.dart:4262
#6      BuildOwner.buildScope 
package:flutter/…/widgets/framework.dart:2667
#7      WidgetsBinding.drawFrame 
package:flutter/…/widgets/binding.dart:866
#8      RendererBinding._handlePersistentFrameCallback 
package:flutter/…/rendering/binding.dart:286
#9      SchedulerBinding._invokeFrameCallback 
package:flutter/…/scheduler/binding.dart:1115
#10     SchedulerBinding.handleDrawFrame 
package:flutter/…/scheduler/binding.dart:1054
#11     SchedulerBinding._handleDrawFrame 
package:flutter/…/scheduler/binding.dart:970
#15     _invoke  (dart:ui/hooks.dart:253:10)
#16     _drawFrame  (dart:ui/hooks.dart:211:3)
(elided 3 frames from dart:async)
═╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
生成MapWidget-[#2721f](脏的,依赖项)时引发以下NoSuchMethodError:
[InheritedProvider,InheritedProvider],状态:
_MapWidgetState#50617):
对null调用了方法“moveCamera”。
收件人:空
尝试调用:moveCamera(“CameraUpdate”的实例)
导致错误的相关小部件是:
MapWidget-[#2721f]
lib\screen\map\u screen.省道:20
引发异常时,这是堆栈:
#0 Object.noSuchMethod(省道:核心补片/对象补片。省道:51:5)
#1\u MapWidgetState.build
软件包:spotycar/../map\u屏幕/map\u小部件。dart:39
#2 StatefulElement.build
包:flatter/../widgets/framework.dart:4663
#3 ComponentElement.PerformBuild
包:flatter/../widgets/framework.dart:4546
#4 StatefulElement.PerformBuild
包:flatter/../widgets/framework.dart:4719
#5.重建
包:flatter/../widgets/framework.dart:4262
#6 BuildOwner.buildScope
包:flatter/../widgets/framework.dart:2667
#7 WidgetsBinding.drawFrame
包:flatter/../widgets/binding.dart:866
#8渲染器绑定。\u handlePersistentFrameCallback
包:flatter/../rendering/binding.dart:286
#9 SchedulerBinding.\u调用远程回调
包:flatter/../scheduler/binding.dart:1115
#10 SchedulerBinding.handleDrawFrame
包:flatter/../scheduler/binding.dart:1054
#11计划绑定(handleDrawFrame)
包:flatter/../scheduler/binding.dart:970
#15_调用(dart:ui/hooks.dart:253:10)
#16_拉丝架(省道:ui/挂钩。省道:211:3)
(从dart中删除3帧:异步)

要解决此问题,您需要使用补全符而不是简单的GoogleMapController

当您实例化它时:

Completer<GoogleMapController> _controller = Completer();
每当你想改变相机的位置:

Future<void> moveCamera() async {
  final GoogleMapController controller = await _controller.future;
  controller.moveCamera(CameraUpdate.newCameraPosition(CameraPosition(
    target: LatLong(..., ...),
    zoom: ...,
  )));
}
Future moveCamera()异步{
最终GoogleMapController=wait_controller.future;
控制器.移动摄像机(摄像机更新.新摄像机位置(摄像机位置(
目标:LatLong(…,…),
缩放:。。。,
)));
}

你应该表现得很好

为这个方法添加一些代码“moveCamera”在null上被调用。@griffins对不起,我还不明白你的答案。“moveCamera”方法不是我的,但它是来自软件包的方法。我在“onmacreated”方法中添加了一个“cameraUpdate”的打印,它返回“cameraUpdate”的实例,但它实际上可以工作。十天后,我仍然有同样的问题,所以欢迎您的帮助!:)你有什么依赖关系?我试图运行您的代码来复制issueThanks,但我在GitHub上得到了解决方案:您在评论中提到,您已经解决了问题。您能否分享一些见解,让社区了解解决方案是什么?你可以把它放在答案部分,接受为答案。
onMapCreated: (GoogleMapController controller) {
      _controller.complete(controller);
      ...
},
Future<void> moveCamera() async {
  final GoogleMapController controller = await _controller.future;
  controller.moveCamera(CameraUpdate.newCameraPosition(CameraPosition(
    target: LatLong(..., ...),
    zoom: ...,
  )));
}