Spec-Zone.ru › Kotlin 2

Что нового в Compose Multiplatform 1.7.3

Основные нововведения этого выпуска:

  • Типобезопасная навигация

  • Переходы с общими элементами

  • Мультплатформенные ресурсы в ресурсах Android

  • Пользовательские каталоги ресурсов

  • Поддержка мультплатформенных тестовых ресурсов

  • Улучшенное взаимодействие с касаниями в iOS

  • Material3 adaptive и material3-window-size-class теперь доступны в общем коде

  • Реализация перетаскивания на компьютерах

  • BasicTextField на компьютерах

Полный список изменений этого выпуска см. на GitHub.

Зависимости

  • Плагин Gradle org.jetbrains.compose, версия 1.7.3. Основан на библиотеках Jetpack Compose:

    • Runtime 1.7.5

    • UI 1.7.5

    • Foundation 1.7.5

    • Material 1.7.5

    • Material3 1.3.1

  • Библиотеки Lifecycle org.jetbrains.androidx.lifecycle:lifecycle-*:2.8.3. Основаны на Jetpack Lifecycle 2.8.5.

  • Библиотеки Navigation org.jetbrains.androidx.navigation:navigation-*:2.8.0-alpha10. Основаны на Jetpack Navigation 2.8.0.

  • Библиотеки Material3 Adaptive org.jetbrains.compose.material3.adaptive:adaptive-*:1.0.0. Основаны на Jetpack Material3 Adaptive 1.0.0

Несовместимые изменения

Минимальная версия AGP повышена до 8.1.0

Ни Jetpack Compose 1.7.0, ни Lifecycle 2.8.0, которые используются в Compose Multiplatform 1.7.0, не поддерживают AGP 7. Поэтому при обновлении до Compose Multiplatform 1.7.3 может потребоваться обновить и зависимость AGP.

Новые предварительные просмотры Android-компонуемых функций в Android Studio требуют одну из последних версий AGP.

Java API ресурсов объявлен устаревшим в пользу мультплатформенной библиотеки ресурсов

В этом выпуске мы явно объявляем устаревшими Java API ресурсов, доступные в пакете compose.ui: функции painterResource(), loadImageBitmap(), loadSvgPainter() и loadXmlImageVector(), а также класс ClassLoaderResourceLoader и функции, использующие его.

Рекомендуем перейти на мультплатформенную библиотеку ресурсов. Хотя Java-ресурсы можно использовать с Compose Multiplatform, им недоступны расширенные возможности платформы: генерируемые средства доступа, поддержка нескольких модулей, локализация и другие.

Если вам всё же необходимо обращаться к Java-ресурсам, скопируйте реализацию, предложенную в запросе на включение изменений, чтобы код продолжал работать после обновления до Compose Multiplatform 1.7.3 и перехода на мультплатформенные ресурсы там, где это возможно.

Новое поведение по умолчанию при обработке касаний в нативных элементах iOS

До версии 1.7.3 Compose Multiplatform не мог реагировать на события касания, попадавшие в представления UI взаимодействия, поэтому такие представления полностью обрабатывали последовательность касаний.

В Compose Multiplatform 1.7.3 реализована более сложная логика обработки последовательностей касаний во взаимодействующих представлениях. По умолчанию после первоначального касания теперь вводится задержка, которая помогает родительской компонуемой функции понять, предназначалось ли касание для взаимодействия с нативным представлением, и отреагировать соответствующим образом.

Дополнительные сведения см. в описании в разделе iOS на этой странице или в документации по этой функции.

Отключение минимальной длительности кадра в iOS обязательно

Разработчики часто не замечали предупреждение о дисплеях с высокой частотой обновления, из-за чего пользователи не могли наслаждаться плавной анимацией на устройствах с частотой 120 Гц. Теперь мы строго проверяем это условие. Приложения, созданные с помощью Compose Multiplatform, будут аварийно завершаться, если свойство CADisableMinimumFrameDurationOnPhone в файле Info.plist отсутствует или имеет значение false.

Отключить такое поведение можно, установив для свойства ComposeUIViewControllerConfiguration.enforceStrictPlistSanityCheck значение false.

Modifier.onExternalDrag объявлен устаревшим на компьютерах

Экспериментальный API Modifier.onExternalDrag и связанные с ним API объявлены устаревшими в пользу нового Modifier.dragAndDropTarget. Интерфейс DragData перенесён в пакет compose.ui.draganddrop.

Если вы используете устаревшие API с Compose Multiplatform 1.7.0, вы столкнётесь с ошибкой об устаревшем API. В версии 1.8.0 модификатор onExternalDrag будет полностью удалён.

Для всех платформ

Переходы с общими элементами

Теперь Compose Multiplatform предоставляет API для плавных переходов между компонуемыми функциями с общими элементами. Такие переходы часто полезны при навигации: они помогают пользователям следить за изменениями в интерфейсе.

Подробное описание API см. в документации Jetpack Compose.

Типобезопасная навигация

Compose Multiplatform перенял типобезопасный подход Jetpack Compose к передаче объектов по маршруту навигации. Новые API в Navigation 2.8.0 позволяют Compose проверять граф навигации во время компиляции. Эти API обеспечивают тот же результат, что и плагин Safe Args для навигации на основе XML.

Подробности см. в документации Google о типобезопасности в Navigation Compose.

Мультплатформенные ресурсы

Ресурсы упаковываются в ресурсы Android

Теперь все мультплатформенные ресурсы упаковываются в ресурсы Android. Это позволяет Android Studio создавать предварительные просмотры компонуемых функций Compose Multiplatform в исходных наборах Android.

Предварительные просмотры Android Studio доступны только для компонуемых функций в исходных наборах Android. Для них также требуется одна из последних версий AGP: 8.5.2, 8.6.0-rc01 или 8.7.0-alpha04.

Это также обеспечивает прямой доступ к мультплатформенным ресурсам из WebView и компонентов медиаплеера на Android, поскольку к ресурсам можно обращаться по простому пути, например Res.getUri(“files/index.html”).

Вот пример компонуемой функции Android, которая отображает HTML-страницу ресурса со ссылкой на изображение-ресурс:

// androidMain/kotlin/com/example/webview/App.kt @OptIn(ExperimentalResourceApi::class) @Composable @Preview fun App() { MaterialTheme { val uri = Res.getUri("files/webview/index.html") // Adding a WebView inside AndroidView with layout as full screen. AndroidView(factory = { WebView(it).apply { layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) } }, update = { it.loadUrl(uri) }) } }

Пример работает с таким простым HTML-файлом:

<html> <header> <title> Cat Resource </title> </header> <body> <img src="cat.jpg"> </body> </html>

Оба файла ресурсов в этом примере расположены в исходном наборе commonMain:

File structure of the composeResources directory

Пользовательские каталоги ресурсов

С помощью новой настройки customDirectory в DSL-конфигурации можно связать пользовательский каталог с определённым исходным набором. Это позволяет, например, использовать загруженные файлы в качестве ресурсов.

Мультплатформенный кэш шрифтов

Compose Multiplatform переносит функциональность кэша шрифтов Android на другие платформы, устраняя избыточное чтение байтов ресурсов Font.

Поддержка мультплатформенных тестовых ресурсов

Теперь библиотека ресурсов поддерживает тестовые ресурсы в проектах. Это позволяет:

  • Добавлять ресурсы в исходные наборы для тестирования.

  • Использовать генерируемые средства доступа, доступные только в соответствующих исходных наборах.

  • Упаковывать тестовые ресурсы в приложение только при запуске тестов.

Ресурсы сопоставляются со строковыми идентификаторами для удобного доступа

Ресурсы каждого типа сопоставляются с именами файлов. Например, свойство Res.allDrawableResources позволяет получить карту всех ресурсов drawable и обратиться к нужному ресурсу, передав его строковый идентификатор:

Image(painterResource(Res.allDrawableResources["compose_multiplatform"]!!), null)

Функции для преобразования массивов байтов в ImageBitmap или ImageVector

Добавлены новые функции для преобразования ByteArray в ресурс изображения:

  • decodeToImageBitmap() преобразует файл JPEG, PNG, BMP или WEBP в объект ImageBitmap.

  • decodeToImageVector() преобразует векторный XML-файл в объект ImageVector.

  • decodeToSvgPainter() преобразует SVG-файл в объект Painter. Эта функция недоступна на Android.

Подробности см. в документации.

Новые общие модули

material3.adaptive:adaptive*

Модули Material3 Adaptive теперь доступны в общем коде Compose Multiplatform. Чтобы использовать их, явно добавьте соответствующие зависимости в общий исходный набор в файле build.gradle.kts модуля:

commonMain.dependencies {
    implementation("org.jetbrains.compose.material3.adaptive:adaptive:1.0.0-alpha03")
    implementation("org.jetbrains.compose.material3.adaptive:adaptive-layout:1.0.0-alpha03")
    implementation("org.jetbrains.compose.material3.adaptive:adaptive-navigation:1.0.0-alpha03")
}

material3.material3-adaptive-navigation-suite

Набор адаптивной навигации Material3, необходимый для создания адаптивной навигации с помощью Compose, теперь доступен в общем коде Compose Multiplatform. Чтобы использовать его, явно добавьте зависимость в общий исходный набор в файле build.gradle.kts модуля:

commonMain.dependencies {
    implementation(compose.material3AdaptiveNavigationSuite)
}

material3:material3-window-size-class

Чтобы использовать классы WindowSizeClass, явно добавьте зависимость material3-window-size-class в общий исходный набор в файле build.gradle.kts модуля:

commonMain.dependencies {
    implementation("org.jetbrains.compose.material3:material3-window-size-class:1.7.3")
}

Функция calculateWindowSizeClass() пока недоступна в общем коде. Однако её можно импортировать и вызывать в платформенном коде, например:

// desktopMain/kotlin/main.kt
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass

// ...

val size = calculateWindowSizeClass()

material-navigation

Библиотека material-navigation доступна в общем коде наряду с Compose Multiplatform Navigation. Чтобы использовать её, явно добавьте следующие зависимости в общий исходный набор в файле build.gradle.kts модуля:

commonMain.dependencies {
    implementation("org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10")
    implementation("org.jetbrains.compose.material:material-navigation:1.7.0-beta02")
}

Skia обновлена до Milestone 126

Версия Skia, используемая в Compose Multiplatform через Skiko, обновлена до Milestone 126.

Ранее использовалась Skia Milestone 116. Список изменений между этими версиями см. в примечаниях к выпуску.

GraphicsLayer — новый API для рисования

Новый слой рисования, добавленный в Jetpack Compose 1.7.0, теперь доступен в Compose Multiplatform.

В отличие от Modifier.graphicsLayer, новый класс GraphicsLayer позволяет отображать содержимое компонуемой функции в любом месте. Он полезен в случаях, когда анимированное содержимое требуется отображать в разных сценах.

Подробное описание и примеры см. в справочной документации.

LocalLifecycleOwner перемещён из Compose UI

Класс LocalLifecycleOwner перемещён из пакета Compose UI в пакет Lifecycle.

Это изменение позволяет обращаться к классу и вызывать его вспомогательные API на основе Compose независимо от Compose UI. Однако учтите, что без привязок Compose UI экземпляр LocalLifecycleOwner не будет интегрирован с платформой, а значит, не сможет получать события, специфичные для платформы.

iOS

Улучшенное взаимодействие при обработке касаний между Compose Multiplatform и нативной iOS

В этом выпуске улучшена обработка касаний в представлениях взаимодействия iOS. Теперь Compose Multiplatform пытается определить, предназначено ли касание для представления взаимодействия или его должна обработать Compose. Это позволяет обрабатывать события касания, происходящие в области UIKit или SwiftUI внутри приложения Compose Multiplatform.

По умолчанию Compose Multiplatform задерживает передачу событий касания представлениям взаимодействия на 150 мс:

  • Если за это время перемещение превышает заданный порог расстояния, родительская компонуемая функция перехватит последовательность касаний, и она не будет передана представлению взаимодействия.

  • Если заметного перемещения нет, Compose не будет обрабатывать оставшуюся часть последовательности касаний; её обработает только представление взаимодействия.

Такое поведение соответствует работе нативного UIScrollView. Оно помогает избежать ситуаций, когда последовательность касаний, начавшаяся в представлении взаимодействия, перехватывается, не давая Compose Multiplatform возможности её обработать. Это может привести к неприятным впечатлениям от использования приложения. Например, представьте большой видеоплеер взаимодействия, встроенный в прокручиваемый контекст, например ленивый список. Прокручивать список сложно, когда большую часть экрана занимает видеоплеер, перехватывающий все касания, о которых Compose Multiplatform ничего не знает.

Повышение производительности нативных приложений

В Kotlin 2.0.20 команда Kotlin/Native добилась значительного прогресса в повышении скорости и плавности работы приложений Compose на iOS. В Compose Multiplatform 1.7.3 используются эти оптимизации, а также улучшения производительности из Jetpack Compose 1.7.0.

При сравнении Compose Multiplatform 1.6.11 с Kotlin 2.0.0 и Compose Multiplatform 1.7.3 с Kotlin 2.0.20 мы видим улучшения по всем показателям:

  • Тест производительности LazyGrid имитирует прокрутку LazyVerticalGrid, которая наиболее близка к реальным сценариям использования, и в среднем выполняется на ~9% быстрее. Также значительно сокращается количество пропущенных кадров, из-за которых пользователи обычно воспринимают интерфейс как менее отзывчивый. Проверьте сами: приложения Compose Multiplatform для iOS должны работать гораздо плавнее.

  • Тест производительности VisualEffects отображает множество случайно расположенных компонентов и работает в 3.6 раза быстрее: среднее время CPU для 1000 кадров сократилось с 8,8 до 2,4 секунды.

  • Компонуемая функция AnimatedVisibility анимирует появление и скрытие изображения и демонстрирует ускорение отрисовки на ~6%.

Кроме того, в Kotlin 2.0.20 появилась экспериментальная поддержка конкурентной разметки в сборщике мусора. Включение конкурентной разметки сокращает паузы сборщика мусора и обеспечивает ещё более заметный прирост производительности во всех тестах.

Исходный код этих специфичных для Compose тестов производительности доступен в репозитории Compose Multiplatform:

  • Тест производительности Kotlin/Native

  • Сравнение производительности Kotlin/JVM и Kotlin/Native

Компьютеры

Перетаскивание

В Compose Multiplatform для компьютеров реализован механизм перетаскивания, позволяющий пользователям перетаскивать содержимое в приложение Compose и из него. Чтобы указать потенциальные источники и места назначения для перетаскивания, используйте модификаторы dragAndDropSource и dragAndDropTarget.

Эти модификаторы доступны в общем коде, но пока работают только в исходных наборах для компьютеров и Android. Следите за новостями в будущих выпусках.

Примеры распространённых сценариев использования см. в специальной статье в документации Jetpack Compose.

BasicTextField, переименованный из BasicTextField2, добавлен для компьютеров

В Jetpack Compose компонент BasicTextField2 стал стабильным и был переименован в BasicTextField. В этом выпуске Compose Multiplatform перенёс это изменение в целевые платформы для компьютеров; также планируется добавить его для iOS в стабильной версии 1.7.0.

Новый BasicTextField:

  • Позволяет надёжнее управлять состоянием.

  • Предоставляет новый API TextFieldBuffer для программного изменения содержимого текстового поля.

  • Включает несколько новых API для визуальных преобразований и стилизации.

  • Предоставляет доступ к UndoState с возможностью возвращаться к предыдущим состояниям поля.

Параметры отрисовки для ComposePanel

Указав новый параметр RenderSettings.isVsyncEnabled в конструкторе ComposePanel, можно сообщить реализации отрисовки в бэкенде, что следует отключить вертикальную синхронизацию. Это может уменьшить визуальную задержку между вводом данных и изменениями в интерфейсе, но также привести к разрывам изображения.

Поведение по умолчанию не меняется: ComposePanel пытается синхронизировать отображение отрисованных объектов с VSync.

Веб

skiko.js не нужен приложениям Kotlin/Wasm

Файл skiko.js больше не нужен приложениям Kotlin/Wasm, созданным с помощью Compose Multiplatform. Его можно удалить из файла index.html, чтобы ускорить загрузку приложения. В будущих выпусках skiko.js будет полностью удалён из дистрибутива Kotlin/Wasm.

Файл skiko.js по-прежнему необходим приложениям Kotlin/JS вплоть до Compose Multiplatform 1.9.0. Узнайте, когда это изменилось, в статье «Что нового в Compose Multiplatform 1.9.3».

31 июля 2026 г.
Что нового в Compose Multiplatform 1.8.2Что нового в Compose Multiplatform 1.6.10

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/whats-new-compose-170.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API