Экран A содержит карту Google, на которой есть кнопка, которая перемещает пользователя на другой экран (экран B), где они могут вводить координаты. Координаты тезисов хранятся в firestore и используются для построения маркеров на карте. Затем нажимается кнопка «Назад» на экране 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),
),
),
)
]);
}
}