Spec-Zone.ru › Kotlin 2

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

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

  • Вариативные шрифты

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

  • Глубокие ссылки в iOS

  • Улучшенная поддержка специальных возможностей в iOS

  • Предварительная загрузка ресурсов для веб-целей

  • Интеграция с элементами управления навигацией браузера

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

Зависимости

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

    • Runtime 1.8.2

    • UI 1.8.2

    • Foundation 1.8.2

    • Material 1.8.2

    • Material3 1.3.2

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

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

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

  • Библиотека Savedstate org.jetbrains.androidx.savedstate:savedstate:1.3.1. Основана на Jetpack Savedstate 1.3.0

  • Библиотека WindowManager Core org.jetbrains.androidx.window:window-core:1.4.0-alpha07. Основана на Jetpack WindowManager 1.4.0-alpha04

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

Полный переход Compose Multiplatform на компилятор K2

В этом выпуске кодовая база Compose Multiplatform полностью переведена на компилятор K2. Начиная с версии 1.8.0, нативные и веб-библиотеки klib, создаваемые проектами, зависящими от Compose Multiplatform, можно использовать только с Kotlin 2.1.0 или более поздней версии.

Что это означает для ваших проектов, помимо базовых изменений в плагине Gradle компилятора Compose:

  • Если приложение использует библиотеки, зависящие от Compose Multiplatform: рекомендуем обновить проект до Kotlin 2.1.20, а зависимости — до версий, скомпилированных с Compose Multiplatform 1.8.0 и Kotlin 2.1.x.

  • Если библиотека зависит от Compose Multiplatform: обновите проект до Kotlin 2.1.x и Compose 1.8.0, затем пересоберите библиотеку и опубликуйте новую версию.

Если при обновлении до Compose Multiplatform 1.8.0 возникнут проблемы совместимости, сообщите нам о них, создав задачу в YouTrack.

Удалена неявная зависимость от material-icons-core

Compose Multiplatform 1.8.2 включает изменение, внесенное в Material: транзитивная зависимость от material-icons-core больше не используется. Это согласуется с отказом от зависимостей, собранных с помощью K1.

Если вам нужно продолжить использовать в проекте библиотеку material-icons-core, добавьте зависимость явно в build.gradle.kts, например:

implementation("org.jetbrains.compose.material:material-icons-core:1.7.3")

Также можно использовать векторные значки Android XML из библиотеки Material Symbols.

Переход с Bundle на SavedState в Navigation

Navigation в Compose Multiplatform 1.8.2, как и компонент Android Navigation, переходит на использование класса SavedState для хранения состояний пользовательского интерфейса. Это меняет способ доступа к данным состояния при объявлении пунктов назначения в графе навигации. При обновлении до версии 2.9.* библиотеки Navigation не забудьте изменить такой код, чтобы использовать методы доступа к SavedState.

Для более надежной архитектуры используйте типобезопасный подход к навигации, который не требует строковых маршрутов.

Раньше:

composable(Destinations.Followers.route) { navBackStackEntry ->
    val uId = navBackStackEntry.arguments?.getString("userid")
    val page = navBackStackEntry.arguments?.getString("page")
    if (uId != null && page != null) {
        FollowersMainComposable(navController, accountId = uId, page = page)
    }
}

Начиная с Compose Multiplatform 1.8.2:

composable(Destinations.Followers.route) { navBackStackEntry ->
    val uId = navBackStackEntry.arguments?.read { getStringOrNull("userid") }
    val page = navBackStackEntry.arguments?.read { getStringOrNull("page") }
    if (uId != null && page != null) {
        FollowersMainComposable(navController, accountId = uId, page = page)
    }
}

Устаревший ComposeUIViewControllerDelegate в iOS

API ComposeUIViewControllerDelegate объявлен устаревшим в пользу родительского контроллера представления. Если вы используете устаревший API с Compose Multiplatform 1.8.2, появится ошибка об устаревании, указывающая, что методы класса UIViewController необходимо переопределить через родительский контроллер представления.

Подробнее об отношениях дочерних и родительских контроллеров представления см. в документации для разработчиков Apple.

Удален устаревший параметр platformLayers в iOS

Экспериментальный параметр platformLayers появился в версии 1.6.0, чтобы можно было включить альтернативный режим слоев и отображать всплывающие окна и диалоговые окна за пределами родительского контейнера.

Теперь этот режим используется по умолчанию в iOS, а параметр для его включения удален как устаревший.

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

Новая обработка задержек корутин в тестах

Раньше тесты Compose Multiplatform не считали побочные эффекты с вызовами delay() состоянием покоя. Поэтому, например, следующий тест зависал бесконечно:

@Test
fun loopInLaunchedEffectTest() = runComposeUiTest {
    setContent {
        LaunchedEffect(Unit) {
            while (true) {
                delay(1000)
                println("Tick")
            }
        }
    }
}

Когда корутины вызывают функцию delay() после запуска в области композиции, функции waitForIdle(), awaitIdle() и runOnIdle() теперь считают Compose находящимся в состоянии покоя. Это изменение устраняет зависание теста выше, но нарушает работу тестов, использующих waitForIdle(), awaitIdle() и runOnIdle() для выполнения корутин с delay().

Чтобы в таких случаях получить те же результаты, вручную передвиньте время:

var updateText by mutableStateOf(false)
var text by mutableStateOf("0")
setContent {
    LaunchedEffect(updateText) {
        if (updateText) {
            delay(1000)
            text = "1"
        }
    }
}
updateText = true
waitForIdle()
// Since waitForIdle() no longer waits for the delayed LaunchedEffect() to complete,
// the test needs to advance time to make the following assertion correct:
mainClock.advanceTimeBy(1001)

assertEquals("1", text)

Тесты, в которых уже используются вызовы mainClock.advanceTimeBy() для продвижения тестовых часов, могут иначе вести себя при рекомпозиции, компоновке, отрисовке и выполнении эффектов.

Реализация runOnIdle() приведена в соответствие с Android

Чтобы привести реализацию тестовой функции runOnIdle() в Compose Multiplatform в соответствие с поведением Android, мы внесли следующие изменения:

  • Теперь runOnIdle() выполняет свой action в потоке пользовательского интерфейса.

  • runOnIdle() больше не вызывает waitForIdle() после выполнения action.

Если ваши тесты зависят от этого дополнительного вызова waitForIdle() после действия runOnIdle(), при обновлении тестов для Compose Multiplatform 1.8.2 добавьте вызов при необходимости.

Продвижение времени в тестах отделено от отрисовки

В Compose Multiplatform 1.8.2 функция mainClock.advanceTimeBy() больше не вызывает рекомпозицию, компоновку или отрисовку, если время не было продвинуто за момент отрисовки следующего кадра (виртуальные тестовые кадры отрисовываются каждые 16 мс).

Это может нарушить работу тестов, которые полагаются на отрисовку при каждом вызове mainClock.advanceTimeBy(). Подробности см. в описании PR.

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

Вариативные шрифты

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

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

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

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

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

Новый интерфейс Clipboard

В Compose Multiplatform добавлен новый интерфейс Clipboard из Jetpack Compose.

Ранее использовавшийся интерфейс ClipboardManager объявлен устаревшим в пользу Clipboard. Он был недоступен для веб-целей из-за асинхронной природы Clipboard API в вебе. Новый интерфейс поддерживает функции suspend и совместим со всеми целями, в том числе веб-целями.

Взаимодействие с буфером обмена из общего кода сейчас ограничено особенностями проектирования API. Подробнее см. CMP-7624.

Выравнивание по высоте строки

Общий API для выравнивания по высоте строки, ранее поддерживавшийся Compose Multiplatform только в Android, теперь доступен на всех платформах. С помощью LineHeightStyle.Alignment можно настроить выравнивание строки текста в пространстве, выделенном под ее высоту. Строки текста можно выровнять по нижнему или верхнему краю либо по центру зарезервированного пространства или пропорционально скорректировать по значениям выносных элементов вверх и вниз.

Line-height alignment

Обратите внимание: в Material3 значением выравнивания по высоте строки по умолчанию является Center. Это означает, что в компонентах Material3 на всех платформах текст с lineHeight будет выравниваться по центру, если не указано иное.

iOS

Глубокие ссылки

Используя Compose Multiplatform 1.8.2 вместе с org.jetbrains.androidx.navigation.navigation-compose 2.10.0-alpha02, можно реализовать глубокие ссылки в iOS обычным для Compose способом: назначать глубокие ссылки пунктам назначения и переходить к ним с помощью NavController.

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

Ресурсы Compose в XCFramework

Теперь Compose Multiplatform встраивает ресурсы непосредственно в созданные XCFramework. Библиотеки Compose с ресурсами можно собирать и использовать как стандартные XCFramework.

Для этой функции требуется версия плагина Kotlin Gradle 2.2 или выше.

Улучшения поддержки специальных возможностей

Поддержка языков с написанием справа налево

В Compose Multiplatform 1.8.2 добавлена поддержка специальных возможностей для языков с написанием справа налево, в том числе корректная обработка направления текста при жестах.

Подробнее о поддержке RTL см. в разделе Языки с написанием справа налево.

Специальные возможности для прокручиваемых списков

В этой версии повышена производительность и точность расчетов границ прокрутки и положения элементов. Учет безопасных областей, таких как вырезы и края экрана, обеспечивает точность свойств специальных возможностей при прокрутке вблизи промежутков и отступов.

Также добавлена поддержка объявлений о состоянии прокрутки. Если включен VoiceOver, при прокрутке тремя пальцами вы будете слышать обновления состояния списка. Объявления включают:

  • «Первая страница» — в начале списка.

  • «Следующая страница» — при прокрутке вперед.

  • «Предыдущая страница» — при прокрутке назад.

  • «Последняя страница» — при достижении конца списка.

Также доступны локализованные версии этих объявлений, чтобы VoiceOver мог читать их на выбранном вами языке.

Специальные возможности для представлений-контейнеров

Начиная с Compose Multiplatform 1.8.2, можно задавать семантические свойства порядка обхода для контейнеров, чтобы обеспечить правильный порядок чтения при прокрутке и пролистывании сложных представлений.

Помимо правильной сортировки элементов для программ чтения с экрана, поддержка свойств порядка обхода позволяет переходить между разными группами обхода с помощью жестов специальных возможностей — пролистывания вверх или вниз. Чтобы переключить контейнеры в режим доступной навигации, поверните два пальца на экране, когда активен VoiceOver.

Подробнее о семантических свойствах порядка обхода см. в разделе Специальные возможности.

Доступный ввод текста

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

Доступный ввод текста теперь также можно использовать при тестировании пользовательского интерфейса.

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

Compose Multiplatform для iOS теперь поддерживает два дополнительных способа управления устройством. Вместо сенсорного экрана можно включить AssistiveTouch для использования мыши или трекпада либо «Полный доступ с клавиатуры» для управления с помощью клавиатуры:

  • AssistiveTouch (Настройки | Универсальный доступ | Касание | AssistiveTouch) позволяет управлять iPhone или iPad с помощью указателя подключенной мыши или трекпада. Указатель можно использовать, чтобы нажимать значки на экране, перемещаться по меню AssistiveTouch или вводить текст с помощью экранной клавиатуры.

  • Полный доступ с клавиатуры (Настройки | Универсальный доступ | Клавиатуры | Полный доступ с клавиатуры) позволяет управлять устройством с помощью подключенной клавиатуры. Для навигации можно использовать такие клавиши, как Tab, а для активации элементов — Пробел.

Загрузка дерева специальных возможностей по запросу

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

Это обеспечивает полноценную поддержку голосового управления iOS, VoiceOver и других средств специальных возможностей, использующих дерево специальных возможностей.

Класс AccessibilitySyncOptions, который использовался для настройки синхронизации дерева специальных возможностей, удален за ненадобностью.

Повышена точность вычисления свойств специальных возможностей

Мы обновили свойства специальных возможностей компонентов Compose Multiplatform, чтобы привести их в соответствие с ожидаемым поведением компонентов UIKit. Теперь элементы пользовательского интерфейса предоставляют расширенные данные специальных возможностей, а прозрачные компоненты со значением alpha, равным 0, больше не предоставляют семантические данные специальных возможностей.

Согласование семантики также позволило исправить несколько проблем, связанных с некорректным вычислением свойств специальных возможностей, например отсутствие областей нажатия у элементов DropDown, несоответствие видимого текста меткам специальных возможностей и неправильное состояние переключателей.

Стабильный API для журналирования в iOS

API для ведения журналов операционной системой в iOS теперь стабилен. Функция enableTraceOSLog() больше не требует экспериментального подтверждения и теперь работает аналогично журналированию в Android. Журналы содержат трассировочную информацию, которую можно анализировать с помощью Xcode Instruments для отладки и анализа производительности.

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

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

В iOS данные сеанса перетаскивания представлены объектом UIDragItem. Этот объект содержит информацию о передаче данных между процессами и необязательный локальный объект для использования в приложении. Например, с помощью DragAndDropTransferData(listOf(UIDragItem.fromString(text))) можно перетаскивать текст, а UIDragItem.fromString(text) преобразует его в формат, подходящий для операций перетаскивания. Сейчас поддерживаются только типы String и NSObject.

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

Улучшена обработка касаний в прокручиваемых представлениях взаимодействия

В этом выпуске:

  • Представление Compose с непрокручиваемым содержимым, показанное как модальное UIViewController, можно закрыть жестом смахивания вниз.

  • Вложенные прокручиваемые представления корректно работают в общей инфраструктуре обработки касаний для взаимодействия: при прокрутке нативного содержимого внутри прокручиваемого представления Compose или содержимого Compose внутри прокручиваемого нативного представления пользовательский интерфейс следует логике iOS для разрешения неоднозначных последовательностей касаний.

Подключение параллельной отрисовки

Compose Multiplatform для iOS теперь позволяет выполнять задачи отрисовки в отдельном потоке рендеринга. Параллельная отрисовка может повысить производительность в сценариях без взаимодействия с UIKit.

Чтобы кодировать команды отрисовки в отдельном потоке рендеринга, включите флаг useSeparateRenderThreadWhenPossible класса ComposeUIViewControllerConfiguration или свойство parallelRendering непосредственно в блоке конфигурации ComposeUIViewController:

@OptIn(ExperimentalComposeUiApi::class)
fun main(vararg args: String) {
    UIKitMain {
        ComposeUIViewController(configure = { parallelRendering = true }) {
            // ...
        }
    }
}

Веб

Поддержка элементов управления браузера в библиотеке Navigation

В приложениях Kotlin/Wasm и Kotlin/JS, созданных с помощью Compose Multiplatform, навигация теперь корректно работает с основными элементами управления браузера. Для этого свяжите окно браузера с основным графом навигации с помощью метода window.bindToNavigation(). После этого веб-приложение будет корректно реагировать на нажатие кнопок Назад и Вперед при перемещении по истории браузера (демонстрационное видео см. в запросе на включение изменений 1621).

Веб-приложение также будет изменять адресную строку браузера в соответствии с текущим маршрутом и переходить непосредственно к пункту назначения, если пользователь вставит URL с соответствующим маршрутом (демонстрационное видео см. в запросе на включение изменений 1640). Метод window.bindToNavigation() принимает необязательный параметр getBackStackEntryPath, позволяющий настроить преобразование строк маршрутов во фрагменты URL.

Настройка курсора браузера

Добавлена экспериментальная функция PointerIcon.Companion.fromKeyword() для управления значками, используемыми в качестве указателей мыши на веб-странице. Передав ключевое слово в качестве параметра, можно задать тип курсора в зависимости от контекста. Например, можно назначить разные значки указателя для выделения текста, открытия контекстного меню или отображения процесса загрузки.

Полный список доступных ключевых слов.

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

В Compose Multiplatform 1.8.2 добавлен новый экспериментальный API для предварительной загрузки шрифтов и изображений для веб-целей. Предварительная загрузка помогает предотвратить визуальные проблемы, такие как вспышки неоформленного текста (FOUT) или мерцание изображений и значков.

Теперь доступны следующие функции для загрузки ресурсов и кэширования:

  • preloadFont() — предварительно загружает шрифты.

  • preloadImageBitmap() — предварительно загружает растровые изображения.

  • preloadImageVector() — предварительно загружает векторные изображения.

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

Настольные компьютеры

Улучшение программной отрисовки в Windows

Переход на рекомендуемый компилятор clang для Skia в Windows ускорил отрисовку, выполняемую с помощью CPU. Это в основном влияет на программную отрисовку, поскольку обычно для отрисовки используется GPU, а на CPU выполняется лишь часть вычислений. Поэтому улучшение особенно заметно на некоторых виртуальных машинах и с несколькими старыми видеокартами, которые не поддерживаются Skia: приложения Windows, созданные с помощью Compose Multiplatform, в этих средах теперь работают до 6 раз быстрее, чем в Compose Multiplatform 1.7.3.

Это улучшение, наряду с поддержкой Windows для ARM64, значительно повышает производительность пользовательских интерфейсов Compose Multiplatform в виртуальных системах Windows под macOS.

Поддержка Windows для ARM64

В Compose Multiplatform 1.8.2 добавлена поддержка Windows для ARM64 на JVM, что улучшает общее взаимодействие при сборке и запуске приложений на устройствах Windows с процессорами ARM.

Плагин Gradle

Возможность изменить имя сгенерированного класса Res

Теперь вы можете настроить имя сгенерированного класса ресурсов, который предоставляет доступ к ресурсам приложения. Пользовательские имена особенно полезны для различения ресурсов в проектах с несколькими модулями и помогают соблюдать соглашения об именовании, принятые в проекте.

Чтобы задать пользовательское имя, добавьте следующую строку в блок compose.resources файла build.gradle.kts:

compose.resources {
    nameOfResClass = "MyRes"
}

Подробнее см. в запросе на включение изменений.

Поддержка ресурсов Multiplatform в целевой платформе androidLibrary

Начиная с версии 8.8.0 плагина Android Gradle, вы можете использовать сгенерированные ресурсы в новой целевой платформе androidLibrary. Чтобы Compose Multiplatform соответствовал этим изменениям, мы добавили поддержку новой конфигурации целевой платформы для работы с ресурсами Multiplatform, упакованными в ресурсы Android.

Если вы используете целевую платформу androidLibrary, включите ресурсы в конфигурации:

kotlin {
    androidLibrary {
        androidResources.enable = true
    }
}

В противном случае вы столкнётесь со следующим исключением: org.jetbrains.compose.resources.MissingResourceException: Missing resource with path: ….

20 февраля 2026
Что нового в Compose Multiplatform 1.9.3Что нового в Compose Multiplatform 1.7.3

© 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-180.html

Spec-Zone.ru

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