Изучите код компонуемых функций
Подробно рассмотрим пример компонуемой функции, созданной мастером Kotlin Multiplatform. Во-первых, есть функция App(), которая реализует общий пользовательский интерфейс и может использоваться на всех платформах. Во-вторых, есть платформенный код, который запускает этот интерфейс на каждой платформе.
Реализация компонуемых функций
В файле shared/src/commonMain/kotlin/App.kt найдите функцию App():
@Composable
@Preview
fun App() {
MaterialTheme {
var showContent by remember { mutableStateOf(false) }
Column(
modifier = Modifier
.background(MaterialTheme.colorScheme.primaryContainer)
.safeContentPadding()
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Button(onClick = { showContent = !showContent }) {
Text("Click me!")
}
AnimatedVisibility(showContent) {
val greeting = remember { Greeting().greet() }
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Image(painterResource(Res.drawable.compose_multiplatform), null)
Text("Compose: $greeting")
}
}
}
}
}
Функция App() — это обычная функция Kotlin с аннотацией @Composable. Такие функции называются компонуемыми функциями или просто компонуемыми элементами. Это строительные блоки пользовательского интерфейса на основе Jetpack Compose или Compose Multiplatform.
Функция App() используется в качестве основы архитектуры пользовательского интерфейса приложения и имеет следующую структуру:
MaterialTheme()задает внешний вид приложения. Настройки по умолчанию можно изменить. Например, можно выбрать цвета, формы и типографику.Компонуемый элемент
Column()управляет макетом приложения. Здесь он отображаетButtonнад компонуемым элементомAnimatedVisibility().Button()содержит компонуемый элементText, который отображает текст поверх кнопки.Вызов
AnimatedVisibility()настроен так, чтобы при нажатии кнопки показывать и скрыватьImageс помощью анимации.painterResource()загружает векторное изображение, сохраненное в XML-файле.
Параметр horizontalAlignment функции Column() выравнивает содержимое столбца по центру. Чтобы это сработало, столбец должен занимать всю ширину контейнера. Для этого можно использовать параметр modifier.
Модификаторы — ключевой компонент Jetpack Compose и Compose Multiplatform. Они предоставляют основной механизм для настройки внешнего вида или поведения компонуемых элементов пользовательского интерфейса. Модификаторы создаются с помощью методов типа Modifier. При объединении этих методов в цепочку каждый вызов может изменить Modifier, возвращенный предыдущим вызовом, поэтому порядок имеет значение. Подробнее см. введение в модификаторы Compose Multiplatform и подробную документацию по модификаторам Jetpack Compose.
Управление состоянием
Загруженное изображение должно сохранять свое состояние: оно должно оставаться видимым или скрытым после повторных композиций, пока пользователь не нажмет кнопку. Свойство showContent в компонуемом элементе App() создается с помощью функции mutableStateOf(), а значит, это наблюдаемый объект состояния:
var showContent by remember { mutableStateOf(false) }
Объект состояния обернут вызовом remember(): это означает, что он создается один раз, а затем сохраняется фреймворком. Таким образом, свойство showContent содержит объект состояния с логическим значением. Фреймворк кэширует этот объект состояния, позволяя компонуемым элементам наблюдать за ним.
При изменении значения состояния повторно вызываются все компонуемые элементы, которые за ним наблюдают. Благодаря этому можно перерисовать созданные ими виджеты. Это называется рекомпозицией.
Состояние изменяется только в параметре onClick вызова Button(). Обработчик события меняет значение свойства showContent на противоположное. В результате изображение показывается или скрывается вместе с вызовом Greeting().greet(), так как родительский компонуемый элемент AnimatedVisibility() наблюдает за showContent.
Запуск пользовательского интерфейса на разных платформах
Функция App() выполняется по-разному на каждой платформе:
На Android она управляется активностью.
На iOS — контроллером представления.
На компьютере — окном.
В веб-приложении — контейнером.
Рассмотрим каждый из вариантов.
Android
Для Android откройте файл MainActivity.kt в androidApp/src/main/kotlin:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
setContent {
App()
}
}
}
Это активность Android под названием MainActivity, которая вызывает компонуемый элемент App(), объявленный в общем коде.
iOS
Для iOS откройте файл MainViewController.kt в shared/src/iosMain/kotlin:
fun MainViewController() = ComposeUIViewController { App() }
Это контроллер представления, выполняющий ту же роль, что и активность на Android. Обратите внимание: типы iOS и Android просто вызывают компонуемый элемент App() из общего кода.
Компьютер
Для настольной платформы найдите файл main.kt в desktopApp/src/main/kotlin:
fun main() = application {
Window(
onCloseRequest = ::exitApplication,
title = "ComposeDemo"
) {
App()
}
}
Здесь функция
application()запускает новое настольное приложение. Эта функция принимает лямбду, которая инициализирует пользовательский интерфейс.Обычно в функции
application()создаютWindow, указывают его свойства и задают инструкции для программы, которая должна выполниться при закрытии окна (onCloseRequest). В проекте по умолчанию приложение полностью завершает работу (::exitApplication).В окне можно разместить содержимое. Как и на Android и iOS, здесь содержимым служит только макет пользовательского интерфейса, предоставляемый компонуемым элементом
App().
В этом примере функция App() не принимает параметров. В более крупном приложении обычно передают параметры платформенным зависимостям. Эти зависимости можно написать вручную или передать с помощью библиотеки внедрения зависимостей.
Веб
В файле main.kt в каталоге webApp/src/webMain/kotlin/ найдите функцию main():
@OptIn(ExperimentalComposeUiApi::class)
fun main() {
ComposeViewport {
App()
}
}
Аннотация
@OptIn(ExperimentalComposeUiApi::class)сообщает компилятору, что вы используете экспериментальный API Compose, который может измениться в будущих выпусках.Функция
ComposeViewport{}настраивает среду Compose для приложения.Веб-приложение вставляется в контейнер, указанный в качестве параметра функции
ComposeViewport.Функция
App()отвечает за создание компонентов пользовательского интерфейса приложения с помощью Jetpack Compose.
Следующий шаг
В следующей части руководства вы добавите зависимость в проект и измените пользовательский интерфейс.
Получить помощь
Kotlin Slack. Получите приглашение и присоединитесь к каналу #multiplatform.
Трекер задач Kotlin. Сообщить о новой проблеме.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/compose-multiplatform-explore-composables.html