flutter - 如何使用 Google Maps Plugin Flutter 为另一个类的相机设置动画
问题描述
我有一个main.dart
文件,我正在其中构建一个HomePage()
带有抽屉并列出图块和地图的文件。我已经在另一个 dart 文件中实现了谷歌地图插件(参见下面的代码),我只是MapPage()
在HomePage()
.
现在,当我通过调用函数按下抽屉中的一个列表图块时,我需要为相机设置动画goToLoyola()
,所以我的问题是,我如何才能访问此函数HomePage()
?
对不起,我觉得我的问题很糟糕,但我是新手,还在学习颤振。谢谢你。
class MapPage extends StatefulWidget {
@override
_MapPageState createState() => _MapPageState();
}
class _MapPageState extends State<MapPage> {
GoogleMapController _controller;
LatLng _currentLocation;
CameraPosition _initialCameraLocation;
StreamSubscription _locationSubscription;
Location _location = new Location();
String error;
goToLoyola() {
_controller.animateCamera(CameraUpdate.newCameraPosition(_loyolaCampus));
}
@override
void initState() {
super.initState();
initPlatformState();
_locationSubscription =
_location.onLocationChanged().listen((newLocalData) {
setState(() {
_currentLocation =
LatLng(newLocalData.latitude, newLocalData.longitude);
_initialCameraLocation = CameraPosition(
target: _currentLocation,
zoom: CAMERA_ZOOM,
tilt: CAMERA_TILT,
bearing: CAMERA_BEARING,
);
});
});
}
@override
void dispose() {
if (_locationSubscription != null) {
_locationSubscription.cancel();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
while (_initialCameraLocation == null) {
return Text("Loading Map");
}
return GoogleMap(
myLocationEnabled: true,
myLocationButtonEnabled: true,
compassEnabled: false,
tiltGesturesEnabled: true,
mapType: MapType.normal,
indoorViewEnabled: true,
trafficEnabled: false,
initialCameraPosition: _initialCameraLocation,
onMapCreated: (GoogleMapController controller) {
_controller = controller;
});
}
解决方案
您可以尝试添加Completer<GoogleMapController>
MapPage 构造函数。例如:
class SamplePage extends StatefulWidget {
Completer<GoogleMapController> completer;
SamplePage({Key key, this.completer}) : super(key: key);
@override
State<StatefulWidget> createState() => SamplePageState();
}
class SamplePageState extends State<SamplePage> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
mapType: MapType.normal,
myLocationEnabled: true,
myLocationButtonEnabled: true,
initialCameraPosition: _defaultCameraPosition,
onMapCreated: (GoogleMapController controller) async {
widget.completer.complete(controller);
},
)
);
}
static final CameraPosition _defaultCameraPosition = CameraPosition(
target: LatLng(1.3139961, 103.7041659),
zoom: 14.4746,
);
}
然后在你HomePage()
添加一个像这样的新函数:
...
...
Completer<GoogleMapController> _completer = Completer();
Future<void> animateTo(double lat, double lng) async {
final c = await _completer.future;
final p = CameraPosition(target: LatLng(lat, lng), zoom: 14.4746);
c.animateCamera(CameraUpdate.newCameraPosition(p));
}
...
...
不要忘记将您的
_completer
变量传递给您的MapPage(completer: _completer)
推荐阅读
- javascript - 向函数组件添加状态和生命周期方法
- c# - Xamarin Android 存档错误。路径文件问题
- android - 如何启用拖放并允许用户自定义排序?
- javascript - 完成一个手风琴jQuery功能,我尝试了很多,似乎没有任何工作?
- php - 如何使用已解析的打字稿覆盖表单默认值
- pandas - 行之间的差异作为列中的列表
- javascript - Array 中时间序列对象的移动平均值
- node.js - TestCafe 获取版本
- spring - 如何定位 GraphQLResolver 泛型的接口?
- sql - 如何在 SQL Query 的 where 子句中使用 LIKE,但 LIKE 的值会来自其他查询?