Я реализовал google_maps_fltuter
, и мне нужно обновить маршрут на карте с новыми координатами всякий раз, когда пользователь нажимает на другой маршрут в любом месте в пределах прямоугольника с границами (см. Рисунок ниже). Когда представление отображается изначально, карта монтируется с координатами первого маршрута, но мне также нужно иметь возможность показывать разные маршруты.
У меня есть виджет GestureDetector
, чтобы это происходило, но этоне вызывает класс RouteMap
вообще.
class _PlanJourney extends State<PlanJourney> {
...
GestureDetector(
onTap: () => RouteMap(from, to, routeCoordinates, i),
child: Container(...)
)
...
}
Это класс, который создает карту на основе координат, переданных классу.
class RouteMap extends StatefulWidget {
final fromCoordinate;
final toCoordinate;
final routeCoordinates;
final routeIndex;
RouteMap(this.fromCoordinate, this.toCoordinate, this.routeCoordinates, this.routeIndex);
@override
_RouteMap createState() => _RouteMap(fromCoordinate, toCoordinate, routeCoordinates, routeIndex);
}
class _RouteMap extends State<RouteMap> {
final fromCoordinate;
final toCoordinate;
final routeCoordinates;
final routeIndex;
_RouteMap(this.fromCoordinate, this.toCoordinate, this.routeCoordinates, this.routeIndex);
Completer<GoogleMapController> _controller = Completer();
GoogleMapController mapController;
LatLng _setCenter() {
return LatLng(double.parse(this.toCoordinate.split(',').toList()[1]),
double.parse(this.toCoordinate.split(',').toList()[0]));
}
final Set<Marker> _markers = {};
Map<PolylineId, Polyline> _mapPolylines = {};
int _polylineIdCounter = 1;
void _onMapCreated(GoogleMapController controller) {
_setCenter();
mapController = controller;
_controller.complete(controller);
// the coordinates coming from the API are in LonLat format
// Google map only accepts LatLon format so we have to swap the around
LatLng latLng_1 = LatLng(double.parse(this.fromCoordinate.split(',').toList()[1]),
double.parse(this.fromCoordinate.split(',').toList()[0]));
LatLng latLng_2 = LatLng(double.parse(this.toCoordinate.split(',').toList()[1]),
double.parse(this.toCoordinate.split(',').toList()[0]));
setState(() {
_markers.clear();
addMarker(latLng_1, "Title", "description");
addMarker(latLng_2, "Title", "description");
});
_add(routeIndex);
}
...
Обновление
У меня естьнемного изменил код, но проблема остается. SetState
обновляет значение, которое мне нужно отправить в класс RouteMap
, но сам класс не обновляется.
class _PlanJourney extends State<PlanJourney> {
...
GestureDetector(
onTap: () {
setState(() {
routeIndex = i; // this is the value I need to send to RouteMap class
// print(routeIndex) -> the routeIndex changes
});
},
child: Container(...) // *note the map is not in this container
)
...
}
...
// the map is initially created here
Container(
margin: EdgeInsets.only(bottom: 10),
height: 400,
child: RouteMap(widget.from, widget.to, routeCoordinates[routeIndex], journeyData['routes'][routeIndex])
)
...
...
class RouteMap extends StatefulWidget {
final fromCoordinate;
final toCoordinate;
final routeCoordinates;
final routeIndex;
RouteMap(this.fromCoordinate, this.toCoordinate, this.routeCoordinates, this.routeIndex);
@override
_RouteMap createState() => _RouteMap();
}
class _RouteMap extends State<RouteMap> {
Completer<GoogleMapController> _controller = Completer();
GoogleMapController mapController;
final Set<Marker> _markers = {};
Map<PolylineId, Polyline> _mapPolylines = {};
int _polylineIdCounter = 1;
...
}
...