从另一个屏幕动态加载标记



屏幕A包含一个谷歌地图,该地图有一个按钮,可以将用户导航到另一个屏幕(屏幕B(,用户可以在那里输入坐标。这些坐标存储在消防仓库中,用于在地图上建立标记。然后按下屏幕B上的后退按钮。我想让地图显示新的标记。我可以用一个按钮在地图屏幕上调用setState(),但我不想这么做。我也在考虑使用Streambuilder,但不确定如何实现它,因为标记类是GoogleMap()的属性。有什么建议吗?这是我的代码:

class PlacesMap extends StatefulWidget {
@override
State<PlacesMap> createState() => PlacesMapState();
}
class PlacesMapState extends State<PlacesMap> {
GoogleMapController _mapController;
Map<MarkerId, Marker> _markers = <MarkerId, Marker>{};
@override
void initState() {
super.initState();
_updateMarkers());
}
void _onMapCreated(GoogleMapController controller) {
_updateMarkers();
setState(() {
_mapController = controller;
});
}
void _updateMarkers() async {
QuerySnapshot querySnapshot =
await Firestore.instance.collection('position').getDocuments();
List<DocumentSnapshot> documentList = querySnapshot.documents;
_markers.clear();
documentList.forEach((DocumentSnapshot document) {
GeoPoint pos = document.data['geopoint'];
print(pos.latitude.toString());
print(pos.longitude.toString());
String markerIdVal = document.documentID;
final MarkerId markerId = MarkerId(markerIdVal);
final Marker marker = Marker(
markerId: markerId,
position: LatLng(pos.latitude, pos.longitude),
);
setState(() {
_markers[markerId] = marker;
});
});
}
@override
Widget build(BuildContext context) {
return Stack(children: [
GoogleMap(
initialCameraPosition:
CameraPosition(target: LatLng(43.651070, -79.347015), zoom: 10),
onMapCreated: _onMapCreated,
compassEnabled: true,
markers: Set<Marker>.of(_markers.values),
),
Positioned(
left: 100,
bottom: 100,
right: 100,
child: RaisedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => AddressForm()),
);
},
color: Colors.red,
child: Text(
'POST YOUR ADD',
style: TextStyle(color: Colors.white),
),
),
)
]);
}
}

感谢@pskink引导我找到答案。我能够使用Navigator.push()的返回调用setState()来更新地图屏幕上的标记

Navigator.push(
context,
MaterialPageRoute(builder: (context) => AddressForm()),
).then((value){
setState(() {
_updateMarkers();
});
}

最新更新