Skip to content

Compose overview

yandex-mapkit-kmp-compose module contains features to draw map in your common code using Compose Multiplatform. It contains two variants of API.

First. States API.

It's use YandexMap() composable function draw map and composition context to add MapObjects. All map configuration pass to YandexMap() and nested objects using compose runtime.

Simple setup

YandexMap() composable creates MapView instance in place and draw using compose platform interop features. CameraPositionState control it's map instance.

@Composable
fun MapScreen() {
    rememberAndInitializeMapKit().bindToLifecycleOwner() // if is not called earlier
    val cameraPositionState = rememberCameraPositionState { position = startPosition }
    YandexMap(
        cameraPositionState = cameraPositionState,
        modifier = Modifier.fillMaxSize()
    )
}

CameraPositionState can't be provided to multiple YandexMaps

Configure map

States API provides MapConfig type to configure Map object.

If MapConfig's property is null, it's use MapKit built-in value

@Composable
fun MapScreen() {
    // ...
    val cameraPositionState = rememberCameraPositionState { position = startPosition }
    YandexMap(
        cameraPositionState = cameraPositionState,
        config = MapConfig(
            isNightModeEnabled = isSystemInDarkTheme(),
            poiLimit = 5,
            isFastTapEnabled = null,
            isRotateGesturesEnabled = false,
            isTiltGesturesEnabled = false,
            isScrollGesturesEnabled = false,
            isZoomGesturesEnabled = true,
            mapType = null,
            use2dMode = true,
            logo = MapLogoConfig(
                alignment = LogoAlignment(
                    horizontal = LogoHorizontalAlignment.LEFT,
                    vertical = LogoVerticalAlignment.TOP,
                ),
            ),
        ),
        modifier = Modifier.fillMaxSize(),
    )
}

Advanced. Map effect

States API useful in different cases and might be useful in most simple cases. But if necessary API is not covered with it you is able to use MapEffect.

MapEffect marked as @YandexMapComposable and can be launched only from YandexMap content. MapEffect provides Map instance that is used in YandexMap

@Composable
fun MapScreen() {
    val cameraPositionState = rememberCameraPositionState { position = startPosition }
    YandexMap(
        cameraPositionState = cameraPositionState,
        modifier = Modifier.fillMaxSize(),
    ) {
        MapEffect { map ->
            map.move(startPosition)
        }
    }
}

Second. Controller API.

Simple setup

It's use YandexMap() composable function draw map. It receives YandexMapController that control map using common providing MapWindow instance via controller .

It is not use compose runtime to control map. It provide instance of MapWindow via YandexMapController.mapWindow.

YandexMapController.mapWindow is null if it is not created by YandexMap yet

@Composable
fun MapScreen() {
    rememberAndInitializeMapKit().bindToLifecycleOwner() // if is not called earlier
    val mapController = rememberYandexMapController()
    YandexMap(
        controller = mapController,
        modifier = Modifier.fillMaxSize(),
    )
}

Configure controller

Effect that receives created YandexMapController instance and launched only if MapWindow created. Useful to setup controller.

Provided MapWindow instance is non-null value

@Composable
fun MapScreen() {
    //...
    val mapController = rememberYandexMapController()
    MapControllerEffect(mapController) { mapWindow ->
        mapWindow.map.move(startPosition)
        mapWindow.map.isZoomGesturesEnabled = true
    }
    YandexMap(
        controller = mapController,
        modifier = Modifier.fillMaxSize(),
    )
}