Динамически загружать маркеры во флаттере с другого экрана - PullRequest
0 голосов
/ 10 марта 2020

Экран 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),
          ),
        ),
      )
    ]);
  }
}

1 Ответ

1 голос
/ 10 марта 2020

спасибо @pskink за помощь в ответе. Мне удалось позвонить setState(), используя возврат из Navigator.push(), чтобы обновить маркеры на экране карты

Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => AddressForm()),
            ).then((value){
              setState(() {
            _updateMarkers();
              });
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...