Шаг 0: Предварительные требования. Убедитесь, что у вас установлены: последняя версия IntelliJ IDEA (Community или Ultimate) с плагином Kotlin, Android Studio (если планируете таргетить Android) и Xcode (если планируете таргетить iOS). Для базового примера достаточно IntelliJ IDEA.
Шаг 1: Создание проекта. Откройте IntelliJ IDEA и выберите "New Project". В левом списке найдите "Kotlin Multiplatform" (если такого нет, обновите плагин Kotlin). Выберите шаблон "Application" — он создаст проект с уже настроенными модулями для common, androidApp и iosApp. Назовите проект, например, "KMPFirstApp", и нажмите "Create". Проект будет создан и автоматически начнет синхронизацию зависимостей (это может занять пару минут). Это самый быстрый способ получить рабочую структуру.
Шаг 2: Изучение структуры проекта. После загрузки откроется проект с примерно такой структурой:
- `shared` — это наш мультиплатформенный модуль. Внутри него лежит ключевая папка `src`. В ней:
- `iosMain/kotlin` — код, специфичный для iOS (вызов iOS API через Kotlin/Native).
- `commonTest`, `androidTest`, `iosTest` — для тестов.
- `androidApp` — обычный Android-модуль приложения, который зависит от `shared`.
- `iosApp` — Xcode проект для iOS-приложения, который также зависит от `shared`.
```
class EmailValidator {
fun isValid(email: String): Boolean {
// Простая, но наглядная логика
return email.isNotEmpty() && email.contains("@") && email.contains(".")
}
fun platformMessage(): String {
return "Hello from KMP common code!"
}
}
```
Этот код будет скомпилирован и для Android, и для iOS.
Шаг 4: Используем общий код в Android. Перейдите в `androidApp/src/main/java/.../MainActivity.kt` (путь может немного отличаться). Найдите функцию `onCreate`. Добавьте вызов нашего валидатора и отобразим результат в TextView.
```
import com.yourpackage.kmpfirstapp.EmailValidator // Импорт общего класса!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val validator = EmailValidator()
val email = "test@example.com"
val isValid = validator.isValid(email)
findViewById(R.id.text_view).text =
"${validator.platformMessage()}\nEmail '$email' is valid: $isValid"
}
```
Убедитесь, что в макете `activity_main.xml` есть TextView с id `text_view`.
Шаг 5: Используем общий код в iOS. Это немного магия. Перейдите в `iosApp/iosApp.xcodeproj` и откройте его в Xcode (можно через двойной клик в Finder). В проекте Xcode найдите файл `ContentView.swift` (или аналогичный). Добавьте импорт общего модуля и используйте наш класс.
```
import SwiftUI
import shared // Это автоматически сгенерированный модуль KMP!
struct ContentView: View {
let validator = EmailValidator() // Используем Kotlin-класс напрямую!
var body: some View {
let email = "user@ios.com"
let isValid = validator.isValid(email: email)
Text("\(validator.platformMessage())\nEmail '\(email)' is valid: \(isValid)")
.padding()
}
}
```
Обратите внимание на небольшую разницу в синтаксисе вызова: в Swift имя параметра `email:` появляется автоматически из Kotlin-функции.
Шаг 6: Запуск. Для Android: в IntelliJ IDEA или Android Studio выберите конфигурацию запуска `androidApp` и нажмите Run. Приложение запустится на эмуляторе или устройстве, показывая сообщение из общего кода и результат валидации.
Для iOS: убедитесь, что в IntelliJ IDEA выполнена сборка общего модуля для iOS (часто происходит автоматически). Затем в Xcode выберите симулятор iPhone и нажмите "Run". Приложение соберется и запустится, демонстрируя ту же логику, но уже в нативной iOS-среде.
Шаг 7 (опционально, но важно): Добавление platform-specific кода. Допустим, мы хотим получить название платформы. В общем коде (`commonMain`) объявим `expect`-объявление:
```
expect fun platformName(): String
```
Теперь в `androidMain/kotlin` создадим файл `Platform.kt` с `actual`-реализацией:
```
actual fun platformName(): String = "Android"
```
А в `iosMain/kotlin` в файле `Platform.kt`:
```
actual fun platformName(): String = "iOS"
```
Теперь в общем классе `EmailValidator` можно добавить функцию `fun getFullMessage() = "${platformMessage()} Running on ${platformName()}"`. И она будет возвращать разные строки на разных платформах, используя общий интерфейс.
Готово! За 30 минут вы создали проект Kotlin Multiplatform, написали общую бизнес-логику (валидатор) и успешно запустили ее на двух платформах. Дальнейшие шаги — углубление в механизмы ожиданий/реализаций (expect/actual), настройка библиотек (Ktor для сети, SQLDelight для БД) и организация более сложной архитектуры общего модуля. KMP открывает путь к настоящей кроссплатформенной разработке без компромиссов в производительности и нативном UX.
Комментарии (11)