Обновление маркера в гугл картах алертддиалог в флаттере - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь загрузить googlemap (библиотека google_maps_flutter 0.5.25 + 1) в диалоговом окне, используя следующий метод

_loadMapDialog() {
try {
  if (_currentPosition.latitude == null) {
    Toast.show("Location not available. Please wait...", context,
        duration: Toast.LENGTH_LONG, gravity: Toast.BOTTOM);
    _getLocation(); //_getCurrentLocation();
    return;
  }
  _controller = Completer();
  _userpos = CameraPosition(
    target: LatLng(latitude, longitude),
    zoom: 14.4746,
  );

  markers.add(Marker(
      markerId: markerId1,
      position: LatLng(latitude, longitude),
      infoWindow: InfoWindow(
        title: 'New Location',
        snippet: 'Delivery Location',
      )));

  showDialog(
    context: context,
    builder: (context) {
      return StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return AlertDialog(
            title: Text("Select Your Location"),
            titlePadding: EdgeInsets.all(5),
            content: Text(curaddress),
            actions: <Widget>[
              Container(
                height: screenHeight / 1.4 ?? 600,
                width: screenWidth ?? 400,
                child: 
                GoogleMap(
                  mapType: MapType.normal,
                  initialCameraPosition: _userpos,
                  markers: markers,
                  onMapCreated: (controller) {
                    _controller.complete(controller);
                  },
                  onTap: _loadLoc,
              ),
              )
            ],
          );
        },
      );
    },
  );
} catch (e) {
  print(e);
  return;
}


 }

      void _loadLoc(LatLng loc) async{
        setState(() {
          print("insetstate");
          markers.clear();
          latitude = loc.latitude;
          longitude = loc.longitude;
          label = latitude.toString();
          _getLocationfromlatlng(latitude,longitude);
          _home = CameraPosition(
            target: loc,
            zoom: 14,
          );
          markers.add(Marker(
              markerId: markerId1,
              position: LatLng(latitude, longitude),
              infoWindow: InfoWindow(
                title: 'New Location',
                snippet: 'Delivery Location',
              )));

        });
        _userpos = CameraPosition(
            target: LatLng(latitude, longitude),
            zoom: 14.4746,
          );
        _newhomeLocation();
      }

      Future<void> _newhomeLocation() async {
        gmcontroller = await _controller.future;
        gmcontroller.animateCamera(CameraUpdate.newCameraPosition(_home));
        Navigator.of(context).pop(false);
        _loadMapDialog();
      }

Мне удалось загрузить карту в моем AlertDialog. Проблема в том, что мне нужно иметь возможность выбрать новое местоположение на карте, удалить предыдущий маркер и показать новый маркер на карте, однако маркер не отображается на карте, если приложение не выполняет горячую перезагрузку. На данный момент я использую довольно глупый способ, который выталкивает текущее alerttdialog и показывает его снова с помощью метода _loadMapDialog () для перезагрузки виджета. Я попытался использовать библиотеку flutter_places_dialog, но, похоже, у меня возникла проблема с ошибкой результата возврата активности.

флаттер новичок, будь добр ..

1 Ответ

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

Проблема в том, что вы обновляете маркер с помощью setState, предоставленного StatefulWidget. Но Dialog обновляет свое состояние с помощью setState, предоставляемого StatefulBuilder.

Решение - это добавление setState StatefulBuilder к параметру функции обратного вызова onTap и использование его внутри функции _loadLo c, как мой код.

List<Marker> markers = [];
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('GoogleMap'),
    ),
    body: Center(
      child: RaisedButton(
        onPressed: () {
          showDialog(
            context: (context),
            builder: (context) {
              return StatefulBuilder(builder: (context, newSetState) {
                return AlertDialog(
                  title: Text('Google Map'),
                  content: GoogleMap(
                    initialCameraPosition: CameraPosition(
                        target: LatLng(11.004556, 76.961632), zoom: 14),
                    markers: markers.toSet(),
                    onTap: (newLatLng) {
                      addMarker(newLatLng, newSetState);

                    },
                  ),
                );
              });
            });
      },
    ),
  ),
);

addMarker(latLng, newSetState)
{
  newSetState(() {
    markers.clear();
    markers.add(Marker(markerId: MarkerId('New'), position: latLng));
  });
}
...