Spec-Zone.ru › Kotlin 2

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

Основные нововведения в выпуске Compose Multiplatform 1.6.0:

  • Критические изменения

  • Новый и улучшенный API ресурсов

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

  • API для тестирования пользовательского интерфейса на всех платформах

  • Отдельные представления платформы для всплывающих окон, диалоговых окон и раскрывающихся списков.

  • Объединение изменений из Jetpack Compose и Material 3

  • Артефакты Kotlin/Wasm в стабильных версиях

  • Известные проблемы: отсутствующие зависимости

Зависимости

Эта версия Compose Multiplatform основана на следующих библиотеках Jetpack Compose:

  • Компилятор 1.5.8

  • Среда выполнения 1.6.1

  • Пользовательский интерфейс 1.6.1

  • Foundation 1.6.1

  • Material 1.6.1

  • Material3 1.2.0

Критические изменения

По умолчанию отступы текста с заданным lineHeight обрезаются

С появлением поддержки LineHeightStyle.Trim поведение обрезки отступов текста в Compose Multiplatform стало таким же, как в Android. Подробности см. в запросе на включение изменений.

Это соответствует изменениям compose.material из выпуска 1.6.0-alpha01:

  • Параметр includeFontPadding по умолчанию стал false в Android. Чтобы разобраться в этом изменении подробнее, см. обсуждение отказа от реализации этого флага в Compose Multiplatform.

  • Стиль высоты строки по умолчанию изменен на Trim.None и Alignment.Center. Теперь Compose Multiplatform поддерживает LineHeightStyle.Trim и использует Trim.None в качестве значения по умолчанию.

  • В TextStyle для Typography были добавлены явные lineHeight, что привело к следующему критическому изменению.

При использовании fontSize в MaterialTheme необходимо указывать lineHeight

Это касается только компонентов material. Для material3 такое ограничение действовало и раньше.

Если задать атрибут fontSize для компонента Text в MaterialTheme, но не указать lineHeight, фактическая высота строки не будет изменена в соответствии со шрифтом. Теперь при каждом задании соответствующего fontSize необходимо явно указывать атрибут lineHeight.

Jetpack Compose теперь рекомендует не задавать размер шрифта напрямую:

Для поддержки нестандартных размеров текста мы рекомендуем следовать системе дизайна Material и использовать другую типографическую шкалу, а не изменять размер шрифта напрямую. Также можно переопределить высоту строки, например: style = LocalTextStyle.current.copy(lineHeight = TextUnit.Unspecified), или создать собственный Typography.

Новый подход к организации ресурсов

Если вы использовали API ресурсов в предварительных версиях Compose Multiplatform 1.6.0, ознакомьтесь с документацией для текущей версии: в 1.6.0-beta01 изменился способ хранения файлов ресурсов в папках проекта, чтобы они были доступны коду проекта.

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

Улучшенный API ресурсов (все платформы)

Новый экспериментальный API поддерживает строки и шрифты и упрощает совместное использование ресурсов и доступ к ним в общем коде Kotlin:

  • Ресурсы можно организовать с учетом конкретных настроек и условий, для которых они предназначены, в том числе:

    • Локали

    • Разрешения изображений

    • Темные и светлые темы

  • Теперь Compose Multiplatform создает объект Res для каждого проекта, чтобы упростить доступ к ресурсам.

Подробнее о квалификаторах ресурсов и новом API ресурсов см. в разделе Изображения и ресурсы.

API для тестирования пользовательского интерфейса (экспериментальный, все платформы)

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

Тесты на основе JUnit поддерживаются только в проектах desktop.

Инструкции по настройке и примеры тестов см. в разделе Тестирование пользовательского интерфейса Compose Multiplatform.

Изменения из Jetpack Compose и Material 3 (все платформы)

Jetpack Compose 1.6.1

Объединение с последним выпуском Jetpack Compose положительно влияет на производительность всех платформ. Подробности см. в объявлении в блоге Android Developers.

Другие примечательные возможности этого выпуска:

  • Изменение стандартных отступов шрифта вступило в силу только для целевых платформ Android. Однако не забудьте учесть побочный эффект этого изменения.

  • Выделение текста мышью уже поддерживалось в Compose Multiplatform для других целевых платформ. В версии 1.6.0 оно появилось и в Android.

Возможности Jetpack Compose, которые пока не перенесены в Compose Multiplatform:

  • BasicTextField2

  • Поддержка нелинейного масштабирования шрифтов

  • MultiParagraph.fillBoundingBoxes

  • Перетаскивание между платформами. Сейчас работает только в Android. В desktop можно использовать существующий API: Modifier.onExternalDrag.

Команда JetBrains работает над внедрением этих возможностей в будущие версии Compose Multiplatform.

Compose Material 3 1.2.0

Основные нововведения:

  • Новый экспериментальный компонент Segmented Button с выбором одного или нескольких элементов.

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

    • Примечание по реализации: объект ColorScheme теперь неизменяемый. Если ваш код сейчас напрямую изменяет цвета в ColorScheme, для смены цветов потребуется использовать метод copy.

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

Подробнее об изменениях в Material 3 см. в публикации о выпуске в блоге Material Design.

Отдельные представления платформы для всплывающих окон, диалоговых окон и раскрывающихся списков (iOS, desktop)

Иногда важно, чтобы всплывающие элементы (например, всплывающие подсказки и раскрывающиеся меню) не ограничивались изначальным холстом composable или окном приложения. Это особенно актуально, если представление composable не занимает весь экран, но должно отображать диалоговое окно с предупреждением. В версии 1.6.0 появилась возможность надежно реализовать такое поведение.

Обратите внимание: всплывающие окна и диалоговые окна по-прежнему не могут рисовать за пределами собственных границ (например, тень самого верхнего контейнера).

iOS (стабильная версия)

В iOS эта возможность включена по умолчанию. Чтобы вернуться к прежнему поведению, задайте параметру platformLayers значение false:

ComposeUIViewController(
    configure = {
        platformLayers = false
    }
) {
    // your Compose code
}

Desktop (экспериментальная версия)

Чтобы использовать эту возможность в desktop, задайте системное свойство compose.layers.type. Поддерживаемые значения:

  • WINDOW — для создания компонентов Popup и Dialog в отдельных окнах без оформления.

  • COMPONENT — для создания Popup или Dialog в качестве отдельного компонента Swing в том же окне. Работает только при рендеринге вне экрана, если для compose.swing.render.on.graphics задано значение true (см. раздел Улучшенная интеграция со Swing в примечаниях к выпуску Compose Multiplatform 1.5.0). Обратите внимание: рендеринг вне экрана работает только для компонентов ComposePanel, а не для приложений с полноценным окном.

Пример кода, использующего свойство COMPONENT:

@OptIn(ExperimentalComposeUiApi::class) fun main() = SwingUtilities.invokeLater { System.setProperty("compose.swing.render.on.graphics", "true") System.setProperty("compose.layers.type", "COMPONENT") val window = JFrame() window.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE val contentPane = JLayeredPane() contentPane.layout = null val composePanel = ComposePanel() composePanel.setBounds(200, 200, 200, 200) composePanel.setContent { ComposeContent() } composePanel.windowContainer = contentPane // Use the full window for dialogs contentPane.add(composePanel) window.contentPane.add(contentPane) window.setSize(800, 600) window.isVisible = true } @Composable fun ComposeContent() { Box(Modifier.fillMaxSize().background(Color.Green)) { Dialog(onDismissRequest = {}) { Box(Modifier.size(100.dp).background(Color.Yellow)) } } }

Dialog (желтый цвет) отображается полностью независимо от границ родительского ComposePanel (зеленый цвет):

Dialog outside the bounds of the parent panel

Поддержка стилей линий текстового оформления (iOS, desktop, web)

Теперь в Compose Multiplatform можно задавать стиль подчеркивания текста с помощью класса PlatformTextStyle.

Класс недоступен в общем исходном наборе и должен использоваться в платформенно-зависимом коде.

Пример задания пунктирного подчеркивания:

Text(
  "Hello, Compose",
  style = TextStyle(
    textDecoration = TextDecoration.Underline,
    platformStyle = PlatformTextStyle (
      textDecorationLineStyle = TextDecorationLineStyle.Dotted
    )
  )
)

Можно использовать сплошные, двойные сплошные, точечные, пунктирные и волнистые линии. Все доступные варианты см. в исходном коде.

Доступ к установленным в системе шрифтам (iOS, desktop, web)

Теперь ваше приложение Compose Multiplatform может обращаться к шрифтам, установленным в системе. Используйте класс SystemFont для загрузки шрифтов с нужными стилями и насыщенностью:

import androidx.compose.ui.text.platform.SystemFont

FontFamily(SystemFont("Menlo", weight = 700))
FontFamily(SystemFont("Times New Roman", FontWeight.Bold))
FontFamily(SystemFont("Webdings"))

В desktop можно использовать функцию FontFamily, чтобы загрузить все возможные стили шрифта, указав только название семейства шрифтов (подробный пример см. в образце кода):

FontFamily("Menlo")

iOS

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

Теперь Compose Multiplatform для iOS позволяет людям с ограниченными возможностями взаимодействовать с пользовательским интерфейсом Compose так же удобно, как и с нативным интерфейсом iOS:

  • Программы чтения с экрана и VoiceOver могут получать доступ к содержимому пользовательского интерфейса Compose.

  • Пользовательский интерфейс Compose поддерживает те же жесты навигации и взаимодействия, что и нативные интерфейсы.

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

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

Изменение прозрачности представления composable

Теперь класс ComposeUIViewController содержит дополнительный параметр конфигурации, позволяющий сделать фон представления прозрачным.

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

val appController = ComposeUIViewController(configure = {
      this.opaque = false
}) {
    App()
}

Пример того, чего можно добиться с помощью прозрачного фона:

Compose opaque = false demo

Выделение текста в SelectionContainer двойным и тройным касанием

Ранее в Compose Multiplatform для iOS многократное касание позволяло выделять текст только в полях ввода. Теперь двойное и тройное касания также позволяют выделять текст в компонентах Text внутри SelectionContainer.

Взаимодействие с UIViewController

Некоторые нативные API, не реализованные в виде UIView, например UITabBarController или UINavigationController, нельзя было встроить в интерфейс Compose Multiplatform с помощью существующего механизма взаимодействия.

Теперь в Compose Multiplatform реализована функция UIKitViewController, которая позволяет встраивать нативные контроллеры представлений iOS в пользовательский интерфейс Compose.

Поведение курсора при коротком и длительном касании в текстовых полях, как в нативном интерфейсе

Compose Multiplatform стал еще ближе к нативному поведению курсора в текстовом поле iOS:

  • После одиночного касания курсор в текстовом поле позиционируется точнее.

  • Длительное касание с перетаскиванием в текстовом поле перемещает курсор, а не включает режим выделения, как в Android.

Desktop

Экспериментальная поддержка улучшенного смешивания при взаимодействии

Раньше представление для взаимодействия, реализованное с помощью обертки SwingPanel, всегда имело прямоугольную форму и всегда находилось на переднем плане поверх всех компонентов Compose Multiplatform. Из-за этого было сложно использовать всплывающие элементы (раскрывающиеся меню, всплывающие уведомления). Новая реализация решает эту проблему и позволяет использовать Swing в следующих сценариях:

  • Обрезка. Теперь вас не ограничивает прямоугольная форма: модификаторы обрезки и тени корректно работают с SwingPanel.

    // Flag necessary to enable the experimental blending 
    System.setProperty("compose.interop.blending", "true")
    
    SwingPanel(
        modifier = Modifier.clip(RoundedCornerShape(6.dp))
        //...
    )
    

    Слева показано, как обрезается JButton без этой возможности, а справа — с экспериментальным смешиванием:

    Correct clipping with SwingPanel
  • Перекрытие. Поверх SwingPanel можно отобразить любое содержимое Compose Multiplatform и взаимодействовать с ним как обычно. Здесь «Snackbar» находится поверх панели Swing и содержит кнопку ОК, на которую можно нажать:

    Correct overlapping with SwingPanel

Известные ограничения и дополнительные сведения см. в описании запроса на включение изменений.

Web

Артефакты Kotlin/Wasm доступны в стабильных версиях фреймворка

Стабильные версии Compose Multiplatform теперь поддерживают целевые платформы Kotlin/Wasm. После перехода на версию 1.6.0 вам не нужно указывать в списке зависимостей конкретную версию dev-wasm библиотеки compose-ui.

Для сборки проекта Compose Multiplatform с целевой платформой Wasm требуется Kotlin 1.9.22 или более поздней версии.

Известные проблемы: отсутствующие зависимости

При стандартной конфигурации проекта могут отсутствовать несколько библиотек:

  • org.jetbrains.compose.annotation-internal:annotation или org.jetbrains.compose.collection-internal:collection

    Они могут отсутствовать, если библиотека зависит от Compose Multiplatform 1.6.0-beta02, которая несовместима с версией 1.6.0 на уровне двоичного кода. Чтобы выяснить, какая именно библиотека вызывает проблему, выполните эту команду (замените shared именем основного модуля):

    ./gradlew shared:dependencies
    

    Понизьте версию библиотеки до той, которая зависит от Compose Multiplatform 1.5.12, либо попросите автора библиотеки обновить ее для Compose Multiplatform 1.6.0.

  • androidx.annotation:annotation:... или androidx.collection:collection:...

    Compose Multiplatform 1.6.0 зависит от библиотек collection и annotation, доступных только в репозитории Google Maven.

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

    repositories {
        //...
        google()
    }
    
24 июля 2025 г.
Что нового в Compose Multiplatform 1.6.10Связь между Compose Multiplatform и Jetpack Compose

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

Spec-Zone.ru

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