Kotlin Multiplatform (KMP)

DivKit предоставляет библиотеку для использования в приложениях Kotlin Multiplatform для платформ iOS и Android. Библиотека опубликована в Maven Central в группе com.yandex.divkit.multiplatform и версионируется в соответствии с версиями основной библиотеки DivKit.

Использование

1) Зависимость Gradle

Добавьте библиотеку как зависимость вашего общего модуля:

kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("com.yandex.divkit.multiplatform:divkit-multiplatform:<divkit-version>")
        }
    }
}

2) iOS: подключите продукт DivKitKMP через SPM

В Xcode выберите File → Add Package Dependencies, укажите адрес iOS-пакета DivKit и выберите Exact Version с той же версией <divkit-version>, что и у Maven-зависимости. Добавьте продукт DivKitKMP в target вашего iOS-приложения. Он включает необходимые зависимости DivKit и DivKitExtensions.

Настройте общий Kotlin-модуль так, чтобы он собирал статический iOS-фреймворк:

Показать конфигурацию Gradle
kotlin {
    listOf(iosArm64(), iosSimulatorArm64()).forEach { target ->
        target.binaries.framework {
            baseName = "Shared"
            isStatic = true
        }
    }
}

Подключите этот фреймворк к приложению с помощью прямой интеграции Kotlin. Приложение линкует и Kotlin-фреймворк, и SPM-продукт. Maven-зависимость содержит Kotlin-биндинги, а SPM предоставляет нативную реализацию.

Примечание

Используйте одинаковую релизную версию Maven-зависимости и Swift-пакета DivKit для iOS и обновляйте их вместе.

При миграции существующего приложения удалите DivKitKMP из Podfile, а также явно подключённые поды DivKit, которые заменяет SPM. Обновите интеграцию Pods, если приложение продолжает использовать другие поды. Если сам Kotlin-фреймворк был подключён через CocoaPods, также выполните шаги миграции из руководства по прямой интеграции Kotlin.

3) Рендеринг дивной карточки в мультиплатформенном Kotlin

Вы можете создать область видимости DivKit, используя функцию DivKit, и передать в нее общие DivKitDependencies из общего кода. Внутри этой области видимости вы можете вызвать функцию DivView для рендеринга JSON и вызвать setVariables для установки переменных в глобальное хранилище.

В общем коде:

DivKit(dependencies) {
    var greeting by variable(name = "greeting", value = "Hello, Username")
    Column(
        modifier = Modifier.padding(WindowInsets.safeDrawing.asPaddingValues()),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        DivView(
            cardId = "Sample",
            jsonData = jsonString,
            modifier = Modifier.wrapContentSize()
        )
        Button(
            onClick = {
                greeting = "Hello, DivKit User"
            },
            content = {
                Text("Say \"Hello\"")
            }
        )
    }
}

Также вы можете настроить некоторые платформо-специфичные зависимости в платформо-специфичном коде. Например:

В Android-части:

val environment = DivKitEnvironment.Builder(baseContext = this)
    .imageLoaderFactory { ctx -> CoilDivImageLoader(ctx) }
    .lifecycleOwner(this)
    .build()

setContent {
    inject(environment) {
        MainScreen()
    }
}

В iOS-части метод makeDivKitView возвращает DivKitKMPView, который автоматически обрабатывает:

  • intrinsicContentSize и sizeThatFits для корректного определения размеров
  • Обновление layout при изменении bounds
  • Вызов onVisibleBoundsChanged при изменении видимой области

Узнать больше

Вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.

Репозиторий DivKit

Предыдущая