此函数向 CameraPosition 中的缩放参数返回 null 而不是正确的值,我无法弄清楚



我有一个函数,根据两个谷歌地图标记之间的距离计算所需的CameraPosition缩放量。调用CameraPosition缩放参数(zoomIn)中指定的方法,该方法又调用另一个异步方法,返回两点之间的距离(getDistance)。两种方法都能正常运行,但zoomIn始终返回null,尽管print语句显示了正确的计算值。这是同步问题吗?


@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: GoogleMap(
onMapCreated: addMarkers,
cameraTargetBounds: CameraTargetBounds(createTargetBounds()),
initialCameraPosition: CameraPosition(
target:
LatLng((currentLocation.latitude + latitudesArr[selectedDestination]) / 2,
(currentLocation.longitude + longitudesArr[selectedDestination]) / 2),
zoom: zoomIn(bounds: createTargetBounds(), padding: 200.0)),
),
)
],
);
}
double zoomIn({LatLngBounds bounds, double padding}) {
double zoom;
getDistance(bounds).then((double distance){
print('Distance: $distance');
if (distance > 200){
zoom = 16.0;
} else {
zoom = 18.0;
}
print ('Zoom: $zoom');
});
return zoom;
}
Future<double> getDistance(LatLngBounds bounds) async {
double distance = await Geolocator().distanceBetween(
bounds.southwest.latitude,
bounds.southwest.longitude,
bounds.northeast.latitude,
bounds.northeast.longitude);
print('Distance: $distance');
return distance;
}

The zoomIn function correctly populates the zoom variable with 16.0 or 18.0 depending on the distance between the two markers. However, null is always returned.

好的,我认为正确的方法是在声明谷歌地图小部件时对缩放值进行硬编码,例如:

class MapState extends State<MapRoute> {
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
GoogleMap(
onMapCreated: addMarkers,
myLocationEnabled: true,
cameraTargetBounds: CameraTargetBounds(createTargetBounds()),
initialCameraPosition: CameraPosition(
target:
LatLng((currentLocation.latitude + latitudesArr[selectedDestination]) / 2,
(currentLocation.longitude + longitudesArr[selectedDestination]) / 2),
zoom: 18.0),
),

然后,在本例中,对于addMarkers方法,以下代码将等待,直到GeoLocator返回距离,然后才能确定所需的缩放级别。之后,只需调用地图控制器的moveCamera(CameraUpdate.zoomTo(zoom)),如下所示:

await Geolocator().distanceBetween(
bounds.southwest.latitude,
bounds.southwest.longitude,
bounds.northeast.latitude,
bounds.northeast.longitude)
.then((distance) {
print('The Distance: $distance');
double zoom;
if (distance > 300) {
zoom = 17.0;
} else if (distance > 100){
zoom = 18.0;
} else {
zoom = 19.0;
}
print ('Zoom: $zoom');
controller.moveCamera(CameraUpdate.zoomTo(zoom));
});

相关内容

最新更新