← Назад к вопросам

Можно ли использовать Compose Foundation для Desktop?

2.3 Middle🔥 91 комментариев
#UI и вёрстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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. Практические рекомендации и выводы

  1. Не используйте androidx.compose.* зависимости в чистом Desktop-проекте. Это приведет к конфликтам и не будет работать. Всегда используйте зависимости из пространства имен org.jetbrains.compose.*.

  2. Используйте 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 разработчиков.