Что нового в Compose Multiplatform 1.7.3
Основные нововведения этого выпуска:
Полный список изменений этого выпуска см. на GitHub.
Зависимости
-
Плагин Gradle
org.jetbrains.compose, версия 1.7.3. Основан на библиотеках Jetpack Compose: Библиотеки 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.
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.
Это также обеспечивает прямой доступ к мультплатформенным ресурсам из WebView и компонентов медиаплеера на Android, поскольку к ресурсам можно обращаться по простому пути, например Res.getUri(“files/index.html”).
Вот пример компонуемой функции Android, которая отображает HTML-страницу ресурса со ссылкой на изображение-ресурс:
Пример работает с таким простым HTML-файлом:
Оба файла ресурсов в этом примере расположены в исходном наборе commonMain:
Пользовательские каталоги ресурсов
С помощью новой настройки 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:
Компьютеры
Перетаскивание
В Compose Multiplatform для компьютеров реализован механизм перетаскивания, позволяющий пользователям перетаскивать содержимое в приложение Compose и из него. Чтобы указать потенциальные источники и места назначения для перетаскивания, используйте модификаторы dragAndDropSource и dragAndDropTarget.
Примеры распространённых сценариев использования см. в специальной статье в документации 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.
© 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