Flutter plugin yandex_mapkit не отображает все маркеры/кластеры в Release сборке
Используется Flutter плагин https://pub.dev/packages/yandex_mapkit
Когда запускаешь приложение в режиме разработки (через эмулятор андроида) показываются все маркеры заданные через List<PlacemarkMapObject> помещенные в ClusterizedPlacemarkCollection для отображения в кластерах.
Но когда сборку приложения заливаешь в PlayMarket то на такой сборке показывается только один маркер и всё - все остальные маркеры и кластера исчезают и как я понимаю именно кластера не отображаются.
import 'package:common_flutter/common_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:shop_selection/presentation/helpers/get_clusterized_collection.dart';
import 'package:shop_selection/presentation/helpers/get_placemark_objects.dart';
import 'package:shop_selection/presentation/helpers/map_listener.dart';
import 'package:shop_selection/presentation/pages/shop_selection/cubit/shop_selection_cubit.dart';
import 'package:shop_selection/presentation/widgets/app_bar_widget.dart';
import 'package:shop_selection/presentation/widgets/shops_list_bottom_sheet.dart';
import 'package:ui_kit_flutter/theme.dart';
import 'package:yandex_mapkit/yandex_mapkit.dart';
class ShopSelectionView extends StatefulWidget {
const ShopSelectionView({super.key});
@override
State<ShopSelectionView> createState() => _ShopSelectionViewState();
}
class _ShopSelectionViewState extends StateWithCubit<ShopSelectionCubit, ShopSelectionView> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
/// Контроллер для управления картами
late final YandexMapController _mapController;
/// Значение текущего масштаба карты
double _mapZoom = 10.0;
List<MapObject<dynamic>> mapObjects = [];
@override
void dispose() {
_mapController.dispose();
super.dispose();
}
@override
void onNewsReceived(BlocNews news) {
if (news is ProcessShopsData) {
moveCamera(news.shop.latitude ?? 0.0, news.shop.longitude ?? 0.0, 10);
setMapObjects();
setState(() => _mapZoom = 10);
}
}
void showShopsListBottomSheet(BuildContext context) {
showBottomSheet(
backgroundColor: Colors.white,
context: context,
builder: (context) =>
BlocProvider<ShopSelectionCubit>.value(value: bloc, child: const ShopsListBottomSheet()),
);
}
void moveCamera(double latitude, double longitude, double zoom) async {
await _mapController.moveCamera(
animation: const MapAnimation(type: MapAnimationType.smooth, duration: 1),
CameraUpdate.newCameraPosition(
CameraPosition(
target: Point(latitude: latitude, longitude: longitude),
zoom: zoom,
),
),
);
setState(() => _mapZoom = zoom);
}
void setMapObjects() => setState(() => mapObjects = [
getClusterizedCollection(
placeMarks: getPlacemarkObjects(context),
moveCamera: moveCamera,
mapZoom: _mapZoom,
)
]);
@override
Widget build(BuildContext context) {
final colors = context.theme.extension<RbtColors>();
return BlocConsumer<ShopSelectionCubit, ShopSelectionState>(
listener: (BuildContext context, ShopSelectionState state) {
mapListener(context, state, moveCamera, setMapObjects, _scaffoldKey);
},
builder: (context, state) {
return Scaffold(
key: _scaffoldKey,
backgroundColor: colors?.backgroundDefault,
appBar: AppBarWidget(selectedRegion: state.selectedRegion),
body: YandexMap(
rotateGesturesEnabled: false,
onMapCreated: (controller) async => setState(() => _mapController = controller),
onCameraPositionChanged: (cameraPosition, _, __) =>
setState(() => _mapZoom = cameraPosition.zoom),
mapObjects: mapObjects,
),
);
},
);
}
}
файл get_clusterized_collection.dart
import 'package:shop_selection/resources/assets.dart';
import 'package:ui_kit_flutter/ui_kit_flutter.dart';
import 'package:yandex_mapkit/yandex_mapkit.dart';
/// Метод для получения коллекции кластеризованных маркеров
ClusterizedPlacemarkCollection getClusterizedCollection({
required List<PlacemarkMapObject> placeMarks,
required Function(double latitude, double longitude, double zoom) moveCamera,
required double mapZoom,
}) {
return ClusterizedPlacemarkCollection(
mapId: const MapObjectId(ShopSelectionAssets.clusterized),
placemarks: placeMarks,
radius: 50,
minZoom: 18,
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 {
moveCamera(
cluster.placemarks.first.point.latitude,
cluster.placemarks.first.point.longitude,
mapZoom + 1,
);
});
}
файл get_placemark_objects.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:shop_selection/domain/entities/map_point.dart';
import 'package:shop_selection/presentation/pages/shop_selection/cubit/shop_selection_cubit.dart';
import 'package:shop_selection/resources/assets.dart';
import 'package:yandex_mapkit/yandex_mapkit.dart';
// код из shop_selection_state.dart
List<MapPoint> get points => shopsFiltered
.map((shop) => MapPoint(
name: shop.shopId.toString(),
latitude: shop.latitude ?? 0.0,
longitude: shop.longitude ?? 0.0))
.toList();
/// Метод для генерации объектов маркеров для отображения на карте
List<PlacemarkMapObject> getPlacemarkObjects(BuildContext context) {
// код для points написан выше
List<MapPoint> listMapPoints = context.read<ShopSelectionCubit>().state.points;
List<PlacemarkMapObject> listPlaceMarkObjects = [];
final shopSelected = context.read<ShopSelectionCubit>().state.shopSelected;
for (int i = 0; i < listMapPoints.length; i++) {
listPlaceMarkObjects.add(
PlacemarkMapObject(
mapId: MapObjectId('${ShopSelectionAssets.mapObject} ${listMapPoints[i]}'),
point: Point(latitude: listMapPoints[i].latitude, longitude: listMapPoints[i].longitude),
opacity: 1,
icon: PlacemarkIcon.single(
PlacemarkIconStyle(
image: BitmapDescriptor.fromAssetImage(
shopSelected?.shopId.toString() == listMapPoints[i].name
? ShopSelectionAssets.markerActive
: ShopSelectionAssets.markerIdle),
scale: 1,
),
),
onTap: (_, __) =>
context.read<ShopSelectionCubit>().getShop(int.tryParse(listMapPoints[i].name) ?? 0),
),
);
}
return listPlaceMarkObjects;
}

