Можно ли использовать Compose Foundation для Desktop?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Compose Foundation и Desktop: Совместимость и текущее состояние
Краткий и прямой ответ: Да, Compose Foundation можно использовать для Desktop-приложений, но с критически важными оговорками. Это не автоматическая или стандартная практика, так как для Desktop существует официальный фреймворк Jetpack Compose для Desktop (также известный как Compose Multiplatform для Desktop), который является предпочтительным и рекомендованным путем.
Давайте разберем детали.
1. Различие между Compose Foundation и Compose для Desktop
- Compose Foundation — это низкоуровневая библиотека, объявленная в пакете
androidx.compose.foundation. Она предоставляет базовые строительные блоки для UI (такие какColumn,Row,Box,LazyColumn), базовые модификаторы, обработку жестов, а также готовые компоненты вродеButton,TextField,Image. Она изначально создавалась для Android и зависит от Android-специфичной части —androidx.compose.ui:ui, которая, в свою очередь, завязана на Android Canvas и View систему. - Compose для Desktop — это часть проекта Compose Multiplatform (ранее известного как Compose for Desktop). Он использует переписанную версию Compose UI (
org.jetbrains.compose.ui:ui), которая вместо Android Canvas рисует через Skia — кросс-платформенную графическую библиотеку. Таким образом, он предоставляет практически идентичный API, но с backend'ом под Windows, macOS и Linux.
2. Техническая возможность и сложности
Использовать чистый androidx.compose.foundation в Desktop-проекте технически невозможно напрямую, так как он имеет транзитивные зависимости от Android Framework. Однако, в рамках проекта Compose Multiplatform существует модуль org.jetbrains.compose.foundation:foundation, который является аналогом и портом androidx.compose.foundation для платформы Desktop.
Пример build.gradle.kts для Desktop-приложения с использованием Compose Multiplatform:
import org.jetbrains.compose.compose
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
kotlin("multiplatform")
id("org.jetbrains.compose") version "1.5.10" // Актуальная версия
}
kotlin {
jvm("desktop") {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
sourceSets {
val desktopMain by getting {
dependencies {
implementation(compose.desktop.currentOs) // Основная зависимость
// Внутри этой зависимости уже присутствуют:
// - org.jetbrains.compose.ui:ui
// - org.jetbrains.compose.foundation:foundation
// - org.jetbrains.compose.material:material (или material3)
}
}
}
}
compose.desktop {
application {
mainClass = "MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "MyComposeDesktopApp"
}
}
}
Код пользовательского интерфейса при этом будет выглядеть практически идентично Android-версии, потому что API намеренно сделан совместимым:
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
// Этот код будет работать и на Desktop (через Compose Multiplatform),
// и на Android (через Jetpack Compose).
@Composable
fun App() {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Привет, Desktop!")
Button(onClick = { println("Клик!") }) {
Text("Нажми меня")
}
}
}
fun main() = application {
Window(onCloseRequest = ::exitApplication) {
App()
}
}
3. Практические рекомендации и выводы
-
Не используйте
androidx.compose.*зависимости в чистом Desktop-проекте. Это приведет к конфликтам и не будет работать. Всегда используйте зависимости из пространства именorg.jetbrains.compose.*. -
Используйте Compose Multiplatform для кроссплатформенной разработки. Если ваша цель — разделять UI-логику между Android и Desktop, правильным путем является настройка проекта Kotlin Multiplatform с shared-модулем, где вы будете использовать зависимости
org.jetbrains.compose.*. В таком shared-модуле вы можете писать общий Composable-код, который затем будет работать и на Android (через специальный адаптерcompose.android), и на Desktop.
Пример структуры зависимостей в общем модуле:
```kotlin
// build.gradle.kts общего модуля в KMP
kotlin {
androidTarget()
jvm("desktop")
sourceSets {
val commonMain by getting {
dependencies {
// Композ для общего кода!
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material3)
// compose.ui также будет доступна
}
}
}
}
```
3. API практически идентичен. Разработчик, знакомый с Jetpack Compose для Android, сможет почти сразу начать писать UI для Desktop. Основные отличия лежат в области платформо-специфичных вещей: навигация, работа с файловой системой, меню приложения, окна (Window), системные уведомления и т.д. Для этих целей Compose для Desktop предоставляет свой собственный API (compose.desktop.*).
Итог: Использовать идеи и API Compose Foundation для Desktop не только можно, но и активно поощряется — через официальный фреймворк Compose Multiplatform (для Desktop). Это полноценный, мощный и постоянно развивающийся инструмент для создания нативных UI десктопных приложений на Kotlin, который максимально использует наработки и парадигму из Android-мира, обеспечивая высокую степень повторного использования кода и expertise разработчиков.