KMM+Compose разрабатывает мультиплатформенное приложение Kotlin

предисловие

В настоящее время существует множество кроссплатформенных фреймворков для разработки, таких как тип H5, RN, Flutter и т. д., а мультиплатформенный Kotlin + кроссплатформенный пользовательский интерфейс Compose также может стать полезным фреймворком для разработки в будущем.

ps: следующий KMM относится к мультиплатформенной платформе Kotlin, а не только к Kotlin Multiplatform Mobile.

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

ps: Compose-android является официальным, Compose-desktop является официальным, Compose-web не является официальным, ожидается Compose-ios...

Создание проекта и структурный анализ

Во-первых, мы используем идею для создания оригинального фреймворка KMM+Compose.

Давайте сначала обновим идею до последней (если вы не хотите скачивать идею, вы можете скачать исходный код примера в конце статьи)

Затем: Файл->Создать->Проект

Затем установите местоположение Android SDK и нажмите «Готово».

 После создания хорошего проекта вы можете использовать Android Studio или идею для написания кода.

идея, сначала синхронизируйте градиент:

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

Мы видим, что есть три основных каталога разработки:

Каталог android на самом деле является проектом Android.

Каталог рабочего стола - это каталог программы jvm. Запустите в нем основную функцию, и появится графический интерфейс (то есть программа compose-desktop). Программа в нем в настоящее время работает в упрощенной версии виртуальной машины jvm ( пакет который набирается будет иметь Там упрощенная версия виртуальной машины jvm, поэтому она не зависит от окружения jvm), сказано что в ней будет возможность напрямую конвертировать в нативную (не понятно есть ли там любой)

Общий каталог является основным каталогом kmm, и вы можете видеть, что есть androidMain, commonMain, desktopMain и другие каталоги.

commonMain — это общий каталог кода, который может вызывать только базовую библиотеку kotlin и возможности многоплатформенных сторонних библиотек (таких как compose, ktor и т. д.)

Поскольку commonMain не принадлежит конкретной платформе, его можно передать только androidMain и desktopMain для достижения конкретных возможностей платформы (см. примеры ниже).

Общий каталог относится к каталогу Android, который эквивалентен библиотеке проекта Android.

По сравнению с каталогом рабочего стола общий каталог эквивалентен библиотеке проекта jvm.

ps: поскольку две платформы в настоящее время основаны на jvm, каталог commonMain также может использовать базовые библиотеки jvm (файл и т. д.)

Трехсторонняя библиотека для нескольких платформ

 Основываясь на многоплатформенном фреймворке компоновки, мы можем напрямую писать код компоновки в commonMain, который можно вызывать как в Android, так и на десктопе:

 Мультиплатформенность KMM

Давайте посмотрим на функцию getPlatformName() в App.kt, и мы обнаружим, что она объявлена ​​следующим образом:

 Это эквивалентно объявлению своей подписи в общем модуле, и тогда мы можем реализовать это на каждой платформе.

Реализация этой функции в каталоге androidMain (реализация в desktopMain такая же):

Таким образом, у нас есть возможность многоплатформенной разработки, если несовместимость между платформами объявлена ​​как многоплатформенная функция, которая должна быть реализована, а затем реализована на каждой платформе, ее можно легко использовать в commonMain.

 Далее мы напишем простую программу

текст

составить фото пользовательского интерфейса

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

 

код показывает, как показано ниже:

package com.lt.kmm_and_compose_sample.common

import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

/**
 * creator: lt  2022/3/15  [email protected]
 * effect : 简单的根据数量放置list的条目
 * warning:
 */
@Composable
fun NumberList() {
    //设置数量的状态对象(State)
    var number by remember { mutableStateOf(5) }
    //相当于竖向的线性布局
    Column {
        //相当于横向的线性布局
        Row {
            //设置一个按钮
            Button({
                //按钮的点击事件,点击后改变状态对象内的值,会引发使用该对象的compose组件重组
                number++
            }) {
                //设置按钮内的组件ui
                Text("数量+1")
            }
            //设置一个宽度为8dp的占位,相当于将他们两个隔开了一点(就像margin)
            Spacer(Modifier.width(8.dp))
            Button({
                number--
            }) {
                Text("数量-1")
            }
            Spacer(Modifier.width(8.dp))
            Text("总数量:$number")
        }
        Spacer(Modifier.height(8.dp))
        //相当于竖向的RecyclerView
        LazyColumn {
            //相当于RecyclerView.Adapter,只不过更简单
            items(number) {
                //设置item的ui
                Item(it)
            }
        }
    }
}

@Composable
fun Item(index: Int) {
    //我们的item的ui中只有一个文字,并且设置了一下padding
    Text("索引为:$index", modifier = Modifier.padding(5.dp))
}

Мы аннотируем MainActivity в папке android к коду App(), а затем используем код компоновки, который мы только что написали.

 После запуска проекта Android нажмите на количество +1, текст общего количества изменится, и будет еще одна запись

Затем модифицируем Main.kt в папке на рабочем столе

Затем запустите эту основную функцию, чтобы увидеть эффект compose-desktop (прокрутка LazyColumn прокручивает колесо мыши)

Использование мультиплатформенного подхода KMM

Во-первых, мы определяем ожидаемое удовольствие в файле platform.kt commonMain:

Затем реализуем эту функцию в androidMain и desktopMain, для простоты пишем число напрямую, 

Затем мы немного изменим пользовательский интерфейс:

Добавьте следующий код ниже Text("общее количество: $number"):

ps: может не быть подсказки кода emmm для вызова многоплатформенных функций

            Button({
                number = getNumber()
            }) {
                Text("从本地加载数量")
            }

 Тогда готово простое мультиплатформенное приложение, и у меня есть время позже написать более сложные функции

Источник:  lttttttttttt/KMM_and_Compose_Sample

конец

Supongo que te gusta

Origin blog.csdn.net/qq_33505109/article/details/123497999
Recomendado
Clasificación