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