{"id":358400,"date":"2024-05-21T00:10:59","date_gmt":"2024-05-21T00:10:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=358400"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=358400","title":{"rendered":"<span>Flutter Yandex Mapkit: \u043a\u0430\u043a \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 Flutter. \u0427\u0430\u0441\u0442\u044c 1<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/687\/9c2\/a26\/6879c2a26fd866b61f92a909bd8bf35a.jpg\" width=\"1958\" height=\"1103\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/687\/9c2\/a26\/6879c2a26fd866b61f92a909bd8bf35a.jpg\" data-blurred=\"true\"\/><\/figure>\n<p><em>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <\/em><a href=\"https:\/\/habr.com\/ru\/users\/aakhlestova\/\"><em>\u0410\u043d\u043d\u0430 \u0410\u0445\u043b\u0451\u0441\u0442\u043e\u0432\u0430<\/em><\/a><em>, \u044f Flutter-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 <\/em><a href=\"https:\/\/friflex.com\/\"><em><u>Friflex<\/u><\/em><\/a><em>. \u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 Flutter. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442 \u043d\u0430 Flutter.<\/em>  <\/p>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u043e\u043f\u043b\u0430\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Google Map API \u0432 \u0420\u0424 \u043c\u044b \u0432\u043e Friflex \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432 \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442\u044b.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e Flutter \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/pub.dev\/packages\/yandex_mapkit\"><u>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d yandex_mapkit.<\/u><\/a> \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u0445, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0435\u0433\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/friflex\/articles\/715940\/\"><u>\u043a\u043e\u043b\u043b\u0435\u0433\u0438<\/u><\/a>.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u044f\u0442\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0438\u0445 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0442\u043e\u044f\u0442 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b, \u043f\u0443\u043d\u043a\u0442\u044b \u0432\u044b\u0434\u0430\u0447\u0438 \u0438 \u0442.\u0434.) \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043d\u0435\u0433\u043e;<\/p>\n<\/li>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u0447\u043a\u043e\u0439 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u043e\u043d\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (\u0437\u043e\u043d\u044b \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0442.\u0434.);<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u0440\u043e\u0436\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0410 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u0411.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u2013 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0443\u0437\u043d\u0430\u0435\u043c, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u0438\u0445 \u0440\u0435\u0448\u0438\u0442\u044c.<\/strong><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Yandex Mapkit, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 yandex_mapkit \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b main.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit_demo\/presentation\/map_screen.dart';   void main() {  runApp(const MyApp()); }   class MyApp extends StatelessWidget {  const MyApp({super.key});    @override  Widget build(BuildContext context) {    return const MaterialApp(      title: 'Yandex Mapkit Demo',      home: MapScreen(),    );  } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit\/yandex_mapkit.dart'; import 'package:yandex_mapkit_demo\/data\/map_point.dart'; import 'package:yandex_mapkit_demo\/presentation\/clusterized_icon_painter.dart';   class MapScreen extends StatefulWidget {  const MapScreen({super.key});    @override  State&lt;MapScreen> createState() => _MapScreenState(); }   class _MapScreenState extends State&lt;MapScreen> {  late final YandexMapController _mapController;    @override  void dispose() {    _mapController.dispose();    super.dispose();  }    @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Yandex Mapkit Demo')),      body: YandexMap(        onMapCreated: (controller) async {          _mapController = controller;          await _mapController.moveCamera(            CameraUpdate.newCameraPosition(              const CameraPosition(                target: Point(                  latitude: 50,                  longitude: 20,                ),                zoom: 3,              ),            ),          );        },      ),    );  } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/013\/f7f\/2a3\/013f7f2a3f70df52e401768cce6a0def.jpg\" width=\"1058\" height=\"596\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/013\/f7f\/2a3\/013f7f2a3f70df52e401768cce6a0def.jpg\" data-blurred=\"true\"\/><\/figure>\n<h3>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435\u00a0<\/h3>\n<p>\u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u044b\u0442, \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0443 \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0444\u0438\u0447\u0435\u0439, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Yandex Mapkit.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 MapPoint, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0442\u043e\u0447\u043a\u0438, \u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430 Point, \u043d\u043e \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_point.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:equatable\/equatable.dart';   \/\/\/ \u041c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class MapPoint extends Equatable {  const MapPoint({    required this.name,    required this.latitude,    required this.longitude,  });    \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430  final String name;    \/\/\/ \u0428\u0438\u0440\u043e\u0442\u0430  final double latitude;    \/\/\/ \u0414\u043e\u043b\u0433\u043e\u0442\u0430  final double longitude;    @override  List&lt;Object?> get props => [name, latitude, longitude]; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 MapPoint, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>_getMapPoints()<\/code> \u0432 \u0444\u0430\u0439\u043b\u0435 <em>map_screen.dart<\/em>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;MapPoint> _getMapPoints() {  return const [    MapPoint(name: '\u041c\u043e\u0441\u043a\u0432\u0430', latitude: 55.755864, longitude: 37.617698),    MapPoint(name: '\u041b\u043e\u043d\u0434\u043e\u043d', latitude: 51.507351, longitude: -0.127696),    MapPoint(name: '\u0420\u0438\u043c', latitude: 41.887064, longitude: 12.504809),    MapPoint(name: '\u041f\u0430\u0440\u0438\u0436', latitude: 48.856663, longitude: 2.351556),    MapPoint(name: '\u0421\u0442\u043e\u043a\u0433\u043e\u043b\u044c\u043c', latitude: 59.347360, longitude: 18.341573),  ]; }<\/code><\/pre>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u2014 <code>MapObject<\/code>. \u042d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0443 (\u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u0437\u043e\u043d\u044b, \u043b\u0438\u043d\u0438\u0438 \u0438 \u0442.\u0434.).\u00a0<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 (\u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435) \u2014 <code>PlacemarkMapObject<\/code>. \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c.\u00a0<\/p>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><code>mapObjectId<\/code> \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445;<\/p>\n<\/li>\n<li>\n<p><code>point<\/code> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0440.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p><code>opacity<\/code> \u2014 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (opacity);\u00a0<\/p>\n<\/li>\n<li>\n<p><code>icon<\/code> \u2014 \u0438\u043a\u043e\u043d\u043a\u0443 \u0434\u043b\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p><code>onTap<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e \u0442\u0430\u043f\u0443 \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440;<\/p>\n<\/li>\n<li>\n<p><code>isDraggable<\/code> \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440 \u043f\u043e \u043a\u0430\u0440\u0442\u0435;\u00a0<\/p>\n<\/li>\n<li>\n<p><code>onDrag<\/code>, <code>onDragStart<\/code>, <code>onDragEnd<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, YandexMapkit \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u0432\u0443\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043a\u043e\u043d\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>PlacemarkIcon.single<\/code> \u2014 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>PlacemarkIcon.composite<\/code> \u2014 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445: \u043b\u0438\u0431\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>.png<\/code> \u0438\u0437 <em>assets<\/em> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u042d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Canvas. \u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 <code>Uint8List<\/code>.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>_getPlacemarkObjects()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 <code>_getMapPoints()<\/code> \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0438\u043a\u043e\u043d\u043a\u0430\u043c\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u043c\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <em>assets<\/em>:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;PlacemarkMapObject> _getPlacemarkObjects(BuildContext context) {  return _getMapPoints()      .map(        (point) => PlacemarkMapObject(          mapId: MapObjectId('MapObject $point'),          point: Point(latitude: point.latitude, longitude: point.longitude),          opacity: 1,          icon: PlacemarkIcon.single(            PlacemarkIconStyle(              image: BitmapDescriptor.fromAssetImage(                'assets\/icons\/map_point.png',              ),              scale: 2,            ),          ),        ),      )      .toList(); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u044b, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0445 \u043e\u0442 MapObject, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043f\u043e\u043b\u0435 mapObjects \u0432\u0438\u0434\u0436\u0435\u0442\u0430 YandexMap \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">@override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Yandex Mapkit Demo')),      body: YandexMap(        onMapCreated: (controller) async {          _mapController = controller;          await _mapController.moveCamera(            CameraUpdate.newCameraPosition(              const CameraPosition(                target: Point(                  latitude: 50,                  longitude: 20,                ),                zoom: 3,              ),            ),          );        },        mapObjects: _getPlacemarkObjects(context),      ),    );  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>onTap()<\/code> \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <code>PlacemarkMapObject<\/code>.\u00a0<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432 \u043d\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0438\u0434\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 <code>_ModalBodyView<\/code>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0438\u0306 \u043e \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class _ModalBodyView extends StatelessWidget {  const _ModalBodyView({required this.point});    final MapPoint point;    @override  Widget build(BuildContext context) {    return Padding(      padding: const EdgeInsets.symmetric(vertical: 40),      child: Column(mainAxisSize: MainAxisSize.min, children: [        Text(point.name, style: const TextStyle(fontSize: 20)),        const SizedBox(height: 20),        Text(          '${point.latitude}, ${point.longitude}',          style: const TextStyle(            fontSize: 16,            color: Colors.grey,          ),        ),      ]),    );  } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u043e\u0434 <code>_getPlacemarkObjects(<\/code>) \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432 onTap:<\/p>\n<pre><code class=\"dart\">onTap: (_, __) => showModalBottomSheet(            context: context,            builder: (context) => _ModalBodyView(              point: point,            ),          ), <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit\/yandex_mapkit.dart'; import 'package:yandex_mapkit_demo\/data\/map_point.dart';   class MapScreen extends StatefulWidget {  const MapScreen({super.key});    @override  State&lt;MapScreen> createState() => _MapScreenState(); }   class _MapScreenState extends State&lt;MapScreen> {  late final YandexMapController _mapController;    @override  void dispose() {    _mapController.dispose();    super.dispose();  }    @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Yandex Mapkit Demo')),      body: YandexMap(        onMapCreated: (controller) async {          _mapController = controller;          \/\/ \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u043c \u0432\u0438\u0434 \u043a\u0430\u0440\u0442\u044b \u0431\u043b\u0438\u0436\u0435 \u043a \u0415\u0432\u0440\u043e\u043f\u0435          await _mapController.moveCamera(            CameraUpdate.newCameraPosition(              const CameraPosition(                target: Point(                  latitude: 50,                  longitude: 20,                ),                zoom: 3,              ),            ),          );        },        mapObjects: _getPlacemarkObjects(context),      ),    );  } }   \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;MapPoint> _getMapPoints() {  return const [    MapPoint(name: '\u041c\u043e\u0441\u043a\u0432\u0430', latitude: 55.755864, longitude: 37.617698),    MapPoint(name: '\u041b\u043e\u043d\u0434\u043e\u043d', latitude: 51.507351, longitude: -0.127696),    MapPoint(name: '\u0420\u0438\u043c', latitude: 41.887064, longitude: 12.504809),    MapPoint(name: '\u041f\u0430\u0440\u0438\u0436', latitude: 48.856663, longitude: 2.351556),    MapPoint(name: '\u0421\u0442\u043e\u043a\u0433\u043e\u043b\u044c\u043c', latitude: 59.347360, longitude: 18.341573),  ]; }   \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;PlacemarkMapObject> _getPlacemarkObjects(BuildContext context) {  return _getMapPoints()      .map(        (point) => PlacemarkMapObject(          mapId: MapObjectId('MapObject $point'),          point: Point(latitude: point.latitude, longitude: point.longitude),          opacity: 1,          icon: PlacemarkIcon.single(            PlacemarkIconStyle(              image: BitmapDescriptor.fromAssetImage(                'assets\/icons\/map_point.png',              ),              scale: 2,            ),          ),          onTap: (_, __) => showModalBottomSheet(            context: context,            builder: (context) => _ModalBodyView(              point: point,            ),          ),        ),      )      .toList(); }   \/\/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0438\u0306 \u043e \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class _ModalBodyView extends StatelessWidget {  const _ModalBodyView({required this.point});    final MapPoint point;    @override  Widget build(BuildContext context) {    return Padding(      padding: const EdgeInsets.symmetric(vertical: 40),      child: Column(mainAxisSize: MainAxisSize.min, children: [        Text(point.name, style: const TextStyle(fontSize: 20)),        const SizedBox(height: 20),        Text(          '${point.latitude}, ${point.longitude}',          style: const TextStyle(            fontSize: 16,            color: Colors.grey,          ),        ),      ]),    );  } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f60\/0d0\/cda\/f600d0cdafe92e38dcf75b65fcc818b4.gif\" width=\"1312\" height=\"731\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f60\/0d0\/cda\/f600d0cdafe92e38dcf75b65fcc818b4.gif\"\/><\/figure>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f. \u041d\u043e \u0434\u0430\u0436\u0435 \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u0433\u0434\u0435 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u0435\u0441\u043b\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e, \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0441\u043b\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430.\u00a0<\/p>\n<p>\u042d\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u2014 \u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u0440\u0438 \u0442\u0430\u043f\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u043c\u0430\u0440\u043a\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0437 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e.\u00a0\u00a0<\/p>\n<p>\u042d\u0442\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438 \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432.<\/p>\n<h2>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b<\/h2>\n<p><strong>\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b<\/strong> \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u0430\u0440\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0431\u043b\u0438\u0437\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0432 \u043e\u0434\u0438\u043d \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Yandex Mapkit \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u2014<code>ClusterizedPlacemarkCollection<\/code>. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ul>\n<li>\n<p><code>mapId<\/code> \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p><code>placemarks<\/code> \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p><code>radius<\/code> \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p><code>minZoom<\/code> \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>onClusterAdded()<\/code>. \u041e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043a\u0430\u0440\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u044b\u0435.<\/p>\n<p><code>Cluster<\/code> \u2014 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u0445, \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0438 \u0441\u0432\u043e\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>Cluster<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>copyWith()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u0442\u0435\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0430\u043d\u044b \u0432 <code>copyWith()<\/code>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0432 <code>onClusterAdded()<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Cluster<\/code> \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u043c \u0447\u0435\u0440\u0435\u0437 <code>copyWith()<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>appearance<\/em>.\u00a0<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>appearance,<\/em> \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043a\u0430\u043a <code>PlacemarkMapObject<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c \u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0443 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 (\u043e\u043f\u0438\u0441\u0430\u043d \u0432\u044b\u0448\u0435).<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b. \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u2014 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Canvas.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <em>clusterized_icon_painter.dart<\/em> \u0438 \u0432 \u043d\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>ClusterIconPainter<\/code>. \u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u0440\u0443\u0433\u043b\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443 \u0436\u0435\u043b\u0442\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0441 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u043e\u0439 \u043e\u0431\u0432\u043e\u0434\u043a\u043e\u0439 \u0438 \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u043d\u0443\u0442\u0440\u0438, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class ClusterIconPainter {  const ClusterIconPainter(this.clusterSize);    \/\/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435  final int clusterSize; }<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>clusterSize<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>_paintCirclePlacemark()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0444\u043e\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0439 \u043a\u0440\u0443\u0433 \u0436\u0435\u043b\u0442\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0441 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u043e\u0439 \u043e\u0431\u0432\u043e\u0434\u043a\u043e\u0439):<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b clusterized_icon_painter.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (\u0444\u043e\u043d \u0438 \u043e\u0431\u0432\u043e\u0434\u043a\u0430) Canvas _paintCirclePlacemark({  required Size size,  required PictureRecorder recorder, }) {  final canvas = Canvas(recorder);    final radius = size.height \/ 2.15;    \/\/ \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u0440\u0443\u0433 - \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u0430  final fillPaint = Paint()    ..color = Colors.yellow    ..style = PaintingStyle.fill;    \/\/ \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u0440\u0443\u0433 - \u043e\u0431\u0432\u043e\u0434\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430  final strokePaint = Paint()    ..color = Colors.deepOrangeAccent    ..style = PaintingStyle.stroke    ..strokeWidth = 8;    final circleOffset = Offset(size.height \/ 2, size.width \/ 2);    canvas    ..drawCircle(circleOffset, radius, fillPaint)    ..drawCircle(circleOffset, radius, strokePaint);  return canvas; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>_paintTextCountPlacemarks()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 Canvas \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b clusterized_icon_painter.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442, \/\/\/ \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 void _paintTextCountPlacemarks({  required String text,  required Size size,  required Canvas canvas, }) {  \/\/ \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0442\u0435\u043a\u0441\u0442\u0430, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435  final textPainter = TextPainter(    text: TextSpan(      text: text,      style: const TextStyle(        color: Colors.deepOrangeAccent,        fontSize: 50,        fontWeight: FontWeight.w800,      ),    ),    textDirection: TextDirection.ltr,  )..layout(maxWidth: size.width);    \/\/ \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430  \/\/ \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  final textOffset = Offset(    (size.width - textPainter.width) \/ 2,    (size.height - textPainter.height) \/ 2,  );  textPainter.paint(canvas, textOffset); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>getClusterIconBytes()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0432\u0438\u0434 \u0438\u043a\u043e\u043d\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0442\u044c \u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u0432 <em>assets<\/em>, \u043b\u0438\u0431\u043e \u0438\u0437 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b clusterized_icon_painter.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  \/\/\/ \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0435 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442  Future&lt;Uint8List> getClusterIconBytes() async {    const size = Size(150, 150);    final recorder = PictureRecorder();      \/\/ \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430    _paintTextCountPlacemarks(      text: clusterSize.toString(),      size: size,      canvas: _paintCirclePlacemark(        size: size,        recorder: recorder,      ),    );      \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442    final image = await recorder.endRecording().toImage(          size.width.toInt(),          size.height.toInt(),        );    final pngBytes = await image.toByteData(format: ImageByteFormat.png);      return pngBytes!.buffer.asUint8List();  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b <em>map_screen.dart<\/em>.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>ClusterizedPlacemarkCollection<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>_getClusterizedCollection()<\/code>. \u0412 \u043d\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>onClusterAdd \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/code> \u0441 \u043d\u043e\u0432\u043e\u0439 \u0438\u043a\u043e\u043d\u043a\u043e\u0439, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0440\u0430\u043d\u0435\u0435 \u043a\u043b\u0430\u0441\u0441 <code>ClusterIconPainter<\/code> \u0438 \u043c\u0435\u0442\u043e\u0434 <code>getClusterIconBytes()<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 ClusterizedPlacemarkCollection _getClusterizedCollection({  required List&lt;PlacemarkMapObject> placemarks, }) {  return ClusterizedPlacemarkCollection(      mapId: const MapObjectId('clusterized-1'),      placemarks: placemarks,      radius: 50,      minZoom: 15,      onClusterAdded: (self, cluster) async {        return cluster.copyWith(          appearance: cluster.appearance.copyWith(            opacity: 1.0,            icon: PlacemarkIcon.single(              PlacemarkIconStyle(                image: BitmapDescriptor.fromBytes(                  await ClusterIconPainter(cluster.size).getClusterIconBytes(),                ),              ),            ),          ),        );      }, }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u2014 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043f\u0440\u0438 \u0442\u0430\u043f\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/strong> \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442\u0438\u043f\u0430 <code>double _mapZoom<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b. \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u0439 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0.0.<\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>onCameraPositionChanged<\/code> \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 YandexMap \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u0438\u043b\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043a\u0430\u0440\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b \u0435\u0435 \u0438 \u0442.\u0434.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c <code>_mapZoom<\/code>:<\/p>\n<pre><code class=\"dart\">onCameraPositionChanged: (cameraPosition, _, __) {          setState(() {            _mapZoom = cameraPosition.zoom;          });        },<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>_mapZoom<\/code> \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u043a\u0430\u0440\u0442\u044b.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>_getClusterizedCollection()<\/code>. \u0412 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>onClusterTap<\/code> \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <code>ClusterizedPlacemarkCollection<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043d\u0430 1 \u0435\u0434\u0438\u043d\u0438\u0446\u0443:<\/p>\n<pre><code class=\"dart\">onClusterTap: (self, cluster) async {          await _mapController.moveCamera(            animation: const MapAnimation(                type: MapAnimationType.linear, duration: 0.3),            CameraUpdate.newCameraPosition(              CameraPosition(                target: cluster.placemarks.first.point,                zoom: _mapZoom + 1,              ),            ),          );        });<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>ClusterizedPlacemarkCollection<\/code> \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u044b <code>mapObjects<\/code>:<\/p>\n<pre><code class=\"dart\">mapObjects: [          _getClusterizedCollection(            placemarks: _getPlacemarkObjects(context),          ),        ],<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit\/yandex_mapkit.dart'; import 'package:yandex_mapkit_demo\/data\/map_point.dart'; import 'package:yandex_mapkit_demo\/presentation\/clusterized_icon_painter.dart';   class MapScreen extends StatefulWidget {  const MapScreen({super.key});    @override  State&lt;MapScreen> createState() => _MapScreenState(); }   class _MapScreenState extends State&lt;MapScreen> {  late final YandexMapController _mapController;  var _mapZoom = 0.0;    @override  void dispose() {    _mapController.dispose();    super.dispose();  }    @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Yandex Mapkit Demo')),      body: YandexMap(        onMapCreated: (controller) async {          _mapController = controller;          \/\/ \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u043c \u0432\u0438\u0434 \u043a\u0430\u0440\u0442\u044b \u0431\u043b\u0438\u0436\u0435 \u043a \u0415\u0432\u0440\u043e\u043f\u0435          await _mapController.moveCamera(            CameraUpdate.newCameraPosition(              const CameraPosition(                target: Point(                  latitude: 50,                  longitude: 20,                ),                zoom: 3,              ),            ),          );        },        onCameraPositionChanged: (cameraPosition, _, __) {          setState(() {            _mapZoom = cameraPosition.zoom;          });        },        mapObjects: [          _getClusterizedCollection(            placemarks: _getPlacemarkObjects(context),          ),        ],      ),    );  }    \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432  ClusterizedPlacemarkCollection _getClusterizedCollection({    required List&lt;PlacemarkMapObject> placemarks,  }) {    return ClusterizedPlacemarkCollection(        mapId: const MapObjectId('clusterized-1'),        placemarks: placemarks,        radius: 50,        minZoom: 15,        onClusterAdded: (self, cluster) async {          return cluster.copyWith(            appearance: cluster.appearance.copyWith(              opacity: 1.0,              icon: PlacemarkIcon.single(                PlacemarkIconStyle(                  image: BitmapDescriptor.fromBytes(                    await ClusterIconPainter(cluster.size)                        .getClusterIconBytes(),                  ),                ),              ),            ),          );        },        onClusterTap: (self, cluster) async {          await _mapController.moveCamera(            animation: const MapAnimation(                type: MapAnimationType.linear, duration: 0.3),            CameraUpdate.newCameraPosition(              CameraPosition(                target: cluster.placemarks.first.point,                zoom: _mapZoom + 1,              ),            ),          );        });  } }   \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;MapPoint> _getMapPoints() {  return const [    MapPoint(name: '\u041c\u043e\u0441\u043a\u0432\u0430', latitude: 55.755864, longitude: 37.617698),    MapPoint(name: '\u041b\u043e\u043d\u0434\u043e\u043d', latitude: 51.507351, longitude: -0.127696),    MapPoint(name: '\u0420\u0438\u043c', latitude: 41.887064, longitude: 12.504809),    MapPoint(name: '\u041f\u0430\u0440\u0438\u0436', latitude: 48.856663, longitude: 2.351556),    MapPoint(name: '\u0421\u0442\u043e\u043a\u0433\u043e\u043b\u044c\u043c', latitude: 59.347360, longitude: 18.341573),  ]; }   \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;PlacemarkMapObject> _getPlacemarkObjects(BuildContext context) {  return _getMapPoints()      .map(        (point) => PlacemarkMapObject(          mapId: MapObjectId('MapObject $point'),          point: Point(latitude: point.latitude, longitude: point.longitude),          opacity: 1,          icon: PlacemarkIcon.single(            PlacemarkIconStyle(              image: BitmapDescriptor.fromAssetImage(                'assets\/icons\/map_point.png',              ),              scale: 2,            ),          ),          onTap: (_, __) => showModalBottomSheet(            context: context,            builder: (context) => _ModalBodyView(              point: point,            ),          ),        ),      )      .toList(); }   \/\/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0438\u0306 \u043e \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class _ModalBodyView extends StatelessWidget {  const _ModalBodyView({required this.point});    final MapPoint point;    @override  Widget build(BuildContext context) {    return Padding(      padding: const EdgeInsets.symmetric(vertical: 40),      child: Column(        mainAxisSize: MainAxisSize.min,        children: [          Text(point.name, style: const TextStyle(fontSize: 20)),          const SizedBox(height: 20),          Text(            '${point.latitude}, ${point.longitude}',            style: const TextStyle(              fontSize: 16,              color: Colors.grey,            ),          ),        ],      ),    );  } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b clusterized_icon_painter.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'dart:typed_data'; import 'dart:ui';   import 'package:flutter\/material.dart';   \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class ClusterIconPainter {  const ClusterIconPainter(this.clusterSize);    \/\/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435  final int clusterSize;    \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  \/\/\/ \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0435 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442  Future&lt;Uint8List> getClusterIconBytes() async {    const size = Size(150, 150);    final recorder = PictureRecorder();      \/\/ \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430    _paintTextCountPlacemarks(      text: clusterSize.toString(),      size: size,      canvas: _paintCirclePlacemark(        size: size,        recorder: recorder,      ),    );      \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442    final image = await recorder.endRecording().toImage(          size.width.toInt(),          size.height.toInt(),        );    final pngBytes = await image.toByteData(format: ImageByteFormat.png);      return pngBytes!.buffer.asUint8List();  } }   \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 (\u0444\u043e\u043d \u0438 \u043e\u0431\u0432\u043e\u0434\u043a\u0430) Canvas _paintCirclePlacemark({  required Size size,  required PictureRecorder recorder, }) {  final canvas = Canvas(recorder);    final radius = size.height \/ 2.15;    \/\/ \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u0440\u0443\u0433 - \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u0430  final fillPaint = Paint()    ..color = Colors.yellow    ..style = PaintingStyle.fill;    \/\/ \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u0440\u0443\u0433 - \u043e\u0431\u0432\u043e\u0434\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430  final strokePaint = Paint()    ..color = Colors.deepOrangeAccent    ..style = PaintingStyle.stroke    ..strokeWidth = 8;    final circleOffset = Offset(size.height \/ 2, size.width \/ 2);    canvas    ..drawCircle(circleOffset, radius, fillPaint)    ..drawCircle(circleOffset, radius, strokePaint);  return canvas; }   \/\/\/ \u041c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442, \/\/\/ \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 void _paintTextCountPlacemarks({  required String text,  required Size size,  required Canvas canvas, }) {  \/\/ \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u0442\u0435\u043a\u0441\u0442\u0430, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435  final textPainter = TextPainter(    text: TextSpan(      text: text,      style: const TextStyle(        color: Colors.deepOrangeAccent,        fontSize: 50,        fontWeight: FontWeight.w800,      ),    ),    textDirection: TextDirection.ltr,  )..layout(maxWidth: size.width);    \/\/ \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430  \/\/ \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  final textOffset = Offset(    (size.width - textPainter.width) \/ 2,    (size.height - textPainter.height) \/ 2,  );  textPainter.paint(canvas, textOffset); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ff8\/d0d\/47f\/ff8d0d47f3d2cab4b994b2fe0ed348be.gif\" width=\"1310\" height=\"736\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ff8\/d0d\/47f\/ff8d0d47f3d2cab4b994b2fe0ed348be.gif\"\/><\/figure>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e! \u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c \u043c\u0430\u0440\u043a\u0435\u0440, \u0442\u0430\u043a \u0438 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0433\u0435\u043e\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0437\u043e\u043d\u044b \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0410 \u043a \u0442\u043e\u0447\u043a\u0435 \u0411.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0447\u0443 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445: <a href=\"https:\/\/github.com\/akhlestova\/flutter_yandex_mapkit_example\"><u>\u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/u><\/a>.<\/p>\n<p>\u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442 \u0432\u043e Flutter \u043c\u043e\u0436\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0443 \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u2014 <a href=\"https:\/\/habr.com\/ru\/companies\/friflex\/articles\/715940\/\"><u>\u041a\u0430\u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Flutter<\/u><\/a>.\u00a0\u00a0\u00a0<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u0442\u0435\u043c\u0435 \u0432 <a href=\"https:\/\/t.me\/mapkit\"><u>Telegram-\u0447\u0430\u0442\u0435<\/u><\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e yandex_mapkit.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/769662\/\"> https:\/\/habr.com\/ru\/articles\/769662\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p><em>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <\/em><a href=\"https:\/\/habr.com\/ru\/users\/aakhlestova\/\"><em>\u0410\u043d\u043d\u0430 \u0410\u0445\u043b\u0451\u0441\u0442\u043e\u0432\u0430<\/em><\/a><em>, \u044f Flutter-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 <\/em><a href=\"https:\/\/friflex.com\/\"><em><u>Friflex<\/u><\/em><\/a><em>. \u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 Flutter. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442 \u043d\u0430 Flutter.<\/em>  <\/p>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u043e\u043f\u043b\u0430\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 Google Map API \u0432 \u0420\u0424 \u043c\u044b \u0432\u043e Friflex \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432 \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442\u044b.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442 \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e Flutter \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/pub.dev\/packages\/yandex_mapkit\"><u>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d yandex_mapkit.<\/u><\/a> \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u0445, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u0445 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0435\u0433\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/friflex\/articles\/715940\/\"><u>\u043a\u043e\u043b\u043b\u0435\u0433\u0438<\/u><\/a>.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u044f\u0442\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0438\u0445 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0442\u043e\u044f\u0442 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b, \u043f\u0443\u043d\u043a\u0442\u044b \u0432\u044b\u0434\u0430\u0447\u0438 \u0438 \u0442.\u0434.) \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043d\u0435\u0433\u043e;<\/p>\n<\/li>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u0447\u043a\u043e\u0439 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u043e\u043d\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (\u0437\u043e\u043d\u044b \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0442.\u0434.);<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u0440\u043e\u0436\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0410 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u0411.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u2013 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0443\u0437\u043d\u0430\u0435\u043c, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u043e \u0438\u0445 \u0440\u0435\u0448\u0438\u0442\u044c.<\/strong><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Yandex Mapkit, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 yandex_mapkit \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b main.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit_demo\/presentation\/map_screen.dart';   void main() {  runApp(const MyApp()); }   class MyApp extends StatelessWidget {  const MyApp({super.key});    @override  Widget build(BuildContext context) {    return const MaterialApp(      title: 'Yandex Mapkit Demo',      home: MapScreen(),    );  } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit\/yandex_mapkit.dart'; import 'package:yandex_mapkit_demo\/data\/map_point.dart'; import 'package:yandex_mapkit_demo\/presentation\/clusterized_icon_painter.dart';   class MapScreen extends StatefulWidget {  const MapScreen({super.key});    @override  State&lt;MapScreen> createState() => _MapScreenState(); }   class _MapScreenState extends State&lt;MapScreen> {  late final YandexMapController _mapController;    @override  void dispose() {    _mapController.dispose();    super.dispose();  }    @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Yandex Mapkit Demo')),      body: YandexMap(        onMapCreated: (controller) async {          _mapController = controller;          await _mapController.moveCamera(            CameraUpdate.newCameraPosition(              const CameraPosition(                target: Point(                  latitude: 50,                  longitude: 20,                ),                zoom: 3,              ),            ),          );        },      ),    );  } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><\/figure>\n<h3>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435\u00a0<\/h3>\n<p>\u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u044b\u0442, \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0443 \u0431\u0438\u0437\u043d\u0435\u0441\u0430 \u0444\u0438\u0447\u0435\u0439, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u0430\u0440\u0442\u0430\u043c\u0438. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Yandex Mapkit.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 MapPoint, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0442\u043e\u0447\u043a\u0438, \u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430 Point, \u043d\u043e \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_point.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:equatable\/equatable.dart';   \/\/\/ \u041c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class MapPoint extends Equatable {  const MapPoint({    required this.name,    required this.latitude,    required this.longitude,  });    \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430  final String name;    \/\/\/ \u0428\u0438\u0440\u043e\u0442\u0430  final double latitude;    \/\/\/ \u0414\u043e\u043b\u0433\u043e\u0442\u0430  final double longitude;    @override  List&lt;Object?> get props => [name, latitude, longitude]; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 MapPoint, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>_getMapPoints()<\/code> \u0432 \u0444\u0430\u0439\u043b\u0435 <em>map_screen.dart<\/em>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;MapPoint> _getMapPoints() {  return const [    MapPoint(name: '\u041c\u043e\u0441\u043a\u0432\u0430', latitude: 55.755864, longitude: 37.617698),    MapPoint(name: '\u041b\u043e\u043d\u0434\u043e\u043d', latitude: 51.507351, longitude: -0.127696),    MapPoint(name: '\u0420\u0438\u043c', latitude: 41.887064, longitude: 12.504809),    MapPoint(name: '\u041f\u0430\u0440\u0438\u0436', latitude: 48.856663, longitude: 2.351556),    MapPoint(name: '\u0421\u0442\u043e\u043a\u0433\u043e\u043b\u044c\u043c', latitude: 59.347360, longitude: 18.341573),  ]; }<\/code><\/pre>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u043a\u0430\u0440\u0442\u0435.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u2014 <code>MapObject<\/code>. \u042d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0443 (\u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u0437\u043e\u043d\u044b, \u043b\u0438\u043d\u0438\u0438 \u0438 \u0442.\u0434.).\u00a0<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 (\u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435) \u2014 <code>PlacemarkMapObject<\/code>. \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c.\u00a0<\/p>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><code>mapObjectId<\/code> \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445;<\/p>\n<\/li>\n<li>\n<p><code>point<\/code> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0440.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p><code>opacity<\/code> \u2014 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 (opacity);\u00a0<\/p>\n<\/li>\n<li>\n<p><code>icon<\/code> \u2014 \u0438\u043a\u043e\u043d\u043a\u0443 \u0434\u043b\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p><code>onTap<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e \u0442\u0430\u043f\u0443 \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440;<\/p>\n<\/li>\n<li>\n<p><code>isDraggable<\/code> \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440 \u043f\u043e \u043a\u0430\u0440\u0442\u0435;\u00a0<\/p>\n<\/li>\n<li>\n<p><code>onDrag<\/code>, <code>onDragStart<\/code>, <code>onDragEnd<\/code> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, YandexMapkit \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u0432\u0443\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043a\u043e\u043d\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>PlacemarkIcon.single<\/code> \u2014 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>PlacemarkIcon.composite<\/code> \u2014 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0432 \u0434\u0432\u0443\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445: \u043b\u0438\u0431\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>.png<\/code> \u0438\u0437 <em>assets<\/em> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043b\u0438\u0431\u043e \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u042d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0438\u043a\u043e\u043d\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Canvas. \u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 <code>Uint8List<\/code>.<\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>_getPlacemarkObjects()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 <code>_getMapPoints()<\/code> \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0438\u043a\u043e\u043d\u043a\u0430\u043c\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u043c\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <em>assets<\/em>:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">\/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 List&lt;PlacemarkMapObject> _getPlacemarkObjects(BuildContext context) {  return _getMapPoints()      .map(        (point) => PlacemarkMapObject(          mapId: MapObjectId('MapObject $point'),          point: Point(latitude: point.latitude, longitude: point.longitude),          opacity: 1,          icon: PlacemarkIcon.single(            PlacemarkIconStyle(              image: BitmapDescriptor.fromAssetImage(                'assets\/icons\/map_point.png',              ),              scale: 2,            ),          ),        ),      )      .toList(); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u044b, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0445 \u043e\u0442 MapObject, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043f\u043e\u043b\u0435 mapObjects \u0432\u0438\u0434\u0436\u0435\u0442\u0430 YandexMap \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">@override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(title: const Text('Yandex Mapkit Demo')),      body: YandexMap(        onMapCreated: (controller) async {          _mapController = controller;          await _mapController.moveCamera(            CameraUpdate.newCameraPosition(              const CameraPosition(                target: Point(                  latitude: 50,                  longitude: 20,                ),                zoom: 3,              ),            ),          );        },        mapObjects: _getPlacemarkObjects(context),      ),    );  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>onTap()<\/code> \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <code>PlacemarkMapObject<\/code>.\u00a0<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432 \u043d\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430 \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0438\u0434\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 <code>_ModalBodyView<\/code>:<\/p>\n<pre><code class=\"dart\">\/\/\/ \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0438\u0306 \u043e \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 class _ModalBodyView extends StatelessWidget {  const _ModalBodyView({required this.point});    final MapPoint point;    @override  Widget build(BuildContext context) {    return Padding(      padding: const EdgeInsets.symmetric(vertical: 40),      child: Column(mainAxisSize: MainAxisSize.min, children: [        Text(point.name, style: const TextStyle(fontSize: 20)),        const SizedBox(height: 20),        Text(          '${point.latitude}, ${point.longitude}',          style: const TextStyle(            fontSize: 16,            color: Colors.grey,          ),        ),      ]),    );  } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0435\u0441\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u043e\u0434 <code>_getPlacemarkObjects(<\/code>) \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432\u044b\u0437\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432 onTap:<\/p>\n<pre><code class=\"dart\">onTap: (_, __) => showModalBottomSheet(            context: context,            builder: (context) => _ModalBodyView(              point: point,            ),          ), <\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0430\u0439\u043b map_screen.dart<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">import 'package:flutter\/material.dart'; import 'package:yandex_mapkit\/yandex_mapkit.dart'; import 'package:yandex_mapkit_demo\/data\/map_point.dart';   class MapScreen extends StatefulWidget {  const MapScreen({super.key});    @override  State&lt;MapScreen> createState() => _MapScreenState(); }   class<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-358400","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/358400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=358400"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/358400\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=358400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=358400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=358400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}