Как в YandexMap получить координаты ручного выбора локации и добавить там маркер?
Столкнулся с необходимостью ручного выбора локации на карте и передачи этих координат в другой виджет. Также при касании экрана требуется маркер. Сейчас вывожу карту с некоторой локацией, и теперь два вопроса: как получить координаты новой локации при касании и как в этом месте показать маркер?
class _MapScreenState extends State<MapScreen> {
YandexMapController? _yaMapController;
static const Point _startPoint = Point(latitude: 50, longitude: 50);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Ваша карта'),
),
body: YandexMap(
onMapCreated: (YandexMapController controller) async {
_yaMapController = controller;
await _yaMapController!.moveCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: _startPoint,
zoom: 10,
),
),
animation: const MapAnimation(
type: MapAnimationType.smooth,
duration: 2.0,
),
);
},
onMapTap: (selectedPoint) {
// ?????
},
),
);
}
}
Ответы (2 шт):
Автор решения: YaCor'
→ Ссылка
Отлавливать нажатие должен InputListener, добавить метку на полученные координаты – PlacemarkMapObject.
Если с реализацией возникают какие-то сложности, приводите пример кода и опишите, что не так.
Автор решения: OlleZhuk
→ Ссылка
Более вкрадчивое изучение примеров Yandex MapKit на GitHub позволило скомпоновать вот такой рабочий вариант.
class _MapScreenState extends State<MapScreen> {
late YandexMapController controller;
final List<MapObject> mapObjects = [];
final MapObjectId mapObjectId = const MapObjectId('selPoint');
final animation = MapAnimation(type: MapAnimationType.smooth, duration: 2.0);
static const Point _startPoint = Point(latitude: 50, longitude: 50);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Ваша карта'),
),
body: YandexMap(
mapObjects: mapObjects,
onMapCreated: (YandexMapController yandexMapController) async {
controller = yandexMapController;
await controller.moveCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: _startPoint,
zoom: 10,
),
),
animation: animation,
);
},
onMapTap: (Point selectedPoint) async {
print('Tapped map at $selectedPoint'); // для проверки
final placemark = PlacemarkMapObject(
mapId: mapObjectId,
point: (await controller.getCameraPosition()).target,
opacity: 0.8,
icon: PlacemarkIcon.single(
PlacemarkIconStyle(
image: BitmapDescriptor.fromAssetImage(
'lib/assets/location_icon.png',
),
scale: 0.25,
),
),
);
setState(() {
mapObjects.removeWhere((el) => el.mapId == MapObjectId);
mapObjects.add(placemark);
});
},
),
);
}
}