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.