====== Compose Multiplatform ====== **Compose Multiplatform** (CM) je deklaratívný framework. Slúži na tvorbu **UI** pre viacero platforiem, teda pre Android, iOS, desktop (Linux, Windows), web. Vývoj sa uskutočňuje v jazyku **Kotlin**. Compose Multiplatform je produkt firmy JetBrains a rozširuje sadu nástrojov **Jetpack Compose** od spoločnosti Google pre Android a zároveň zdieľa kompilátor a runtime Compose s Jetpack Compose a používa rovnaké API. Nové projekty je vhodné písať už pod knižnicami **CM**, čo zabezpečí bezproblémové zdieľanie kódu pre MP a ich dokonalejšiu vzájomnú podobnosť. Deklarácia sa realizuje funkciam označenými ''@Composable''. Mená funkcií začínajú veľkým písmenom (ako triedy). **U**žívateľské **R**ozhranie sa kombinuje z týchto funkcií. a ďalších komponentov pre rozloženie. Základné komponenty sú napríklad: ''Row'', ''Column'', ''Text'', ''Button'' a mnoho ďalších. Prispôsobenie komponentov je možné pomocou **modifikátorov**. Spolu všetky komponnety zabezpečia ich rozloženie, vstup od používateľa, animácie a zmeny stavov. \\ V IntelliJ IDEA aj Android Studio sa vizualizuje rozloženie kompozovateľnéhych prvkov označených ako ''@Preview''. > Kotlin : [[https://kotlinlang.org/api/compose-multiplatform/|Material3]] > Android Developers: [[https://developer.android.com/develop/ui/compose/documentation|Jetpack Compose]] > Klibs.io : [[https://klibs.io/|KMP knižnice]] > GitHub : [[https://material-foundation.github.io/material-theme-builder/|Material Theme Builder]] > Material.io : [[https://m3.material.io/|Material Design 3]] (Android, Web, Flutter) > Ak ste pracovali s JavaFX, potom Compose je podobne štrukturovaný. Pridanú hodnotu v Compose tvorí Modifier, ktorý ovplyvňuje vzhľad. ===== Štruktúra projektu ===== Každá platforma potrebuje určitý vstupný bod, teda funkciu či notifikáciu: * Android -> ''Activity'' * iOS -> ''@main'' * JVM -> ''main()'' * Kotlin/JS, Kotlin/Wasm -> ''main()'' **commonMain** je zdrojová zložka s kódom pre Kotlin Multiplatform. Pri kompilácii sa odtiaľ vytvára štruktúra binárnych súborov pre distribúciu. Tu sa použijú len multiplatformové knižnice. Tu definované štruktúry budú dostupné pre všetky platformy projektu. **Ceielené platformy** sa definujú zväčša pri vytvorení projektu, ale je to možné i neskôr (''composeApp.**build.gradle.kts**''). **Zdrojové sady** pre cielené platformy sú vedľa zložky ''commonMain'' a sú vo vlastných zložkách (''androidMain'', ''iosMain'', ''jvmMain'', ...). Každý zdroj obsahuje definíciu cieľa kompilácie, aj dostupné závislosti. ===== Ovládanie UI ===== * **Softvérové ​​klávesnice** - pre iOS napodobňuje podľa Android čo najverenjšie * **Dotyk a Myš** - emulujú sa gestá na pohyb myši, ale nepodpořujú sa viacdotykové gestá * **Kopírovanie**, **Preklad** a podobne - zabezpečuje platforma * **Rolovanie** - pre Android a iOS je v platforme, pre ostatné je to koliesko myši * **Interakcia** - sa riadí podľa manuálov SwiftUI a UIKit a pre počítače podľa Swing * **Späť** - pre Android je to v platforme, pre iOS sa emuluje Android, pre PC klávesou ESC * **Text** - podľa platformy ===== Kompozície komponentov ===== Kompozície svojim rozložením komponetov vytvárajú používateľské rozhrania (UI). Takéto funkcie sú označené náveštím ''@Composable''. Zväčša môžu byť aj v IDE vizualizované označením ''@Preview'', teda ak neprijímajú v parametre stavy. Základné štrukturovanie kompozície je prvkami: * **Column**, **FlowColumn** - prvky pod sebou * **Row**, **FlowRow** - prvky vedľa seba * **Box** - prvky v oblasti ==== Modifikátory ==== umožňujú nastaviť rozmery, zarovnanie, odsadenie, interakcie a iné… > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-layout-modifiers.html#built-in-modifiers|Práca s modifikátormi]] > Android Developers : [[https://developer.android.com/develop/ui/compose/layouts|Rozloženie komponetov]], [[https://developer.android.com/develop/ui/compose/modifiers|Modifikátory]] === Reťazenie modifikátorov === parametre modifikátora je možné zreťaziť: ''Modifier.padding(24.dp).fillMaxWidth()''. Význam má postupnosť volaní, pretože následujúci parameter je viazaný na predchádzajúci. === Vstavané modifikátory === niektoré parametre (napríklad: ''size'', ''padding'' a ''offset'') môžu mať viac parametrov oddelených čiarkami. \\ ''requiredSize()'' prepisuje obmädzenie \\ ''paddingFromBaseline()'' odsadzuje voči zákldnej čiare ''offset()'' relatívne posúva prvok === Modifikátory s obmedzeným rozsahom === ''matchParentSize()'' oznamuje dieťaťu parametee rodiča ''weight()'' v rámci ''Row'' alebo ''Column'' sa vzťahuje k svojim súrodencom === definícia modifikátorov === opätovné použitie inštancií modifikátorov zlepšuje čitateľnosť kódu a môže zvýšiť výkon === Vlastné modifikátory === je môžené si tiež vytvoriť vlastné modifikátory nad rámec vstavaných > Android Developers : [[https://developer.android.com/develop/ui/compose/custom-modifiers#chain-existing|Chain existing modifiers]] ==== Adaptívné rozloženia ==== Pre konzistentný vzhľad na všetkých platformách je vhodné dodržať pokyny: * Preferovť kanonické vzory rozloženia (detaily zoznamu, informačný kanál a podporný panel) * Zachovať konzistenciu opätovným použitím zdieľaných štýlov pre odsadenie, typografiu a ďalšie dizajnové prvky. * Rozdeiť zložité rozloženia na opakovane použiteľné. * Rozmiestňovať podľa hustoty a orientácie obrazovky. > Android Developers : [[https://developer.android.com/develop/ui/compose/layouts/adaptive/canonical-layouts|Kanonické vzory rozloženia]] === Používanie tried veľkostí okien === [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-adaptive-layouts.html#using-window-size-classes|Triedy veľkosti okien]], teda //body zlomu// kategorizujú dizajny rozloženia na kompaktné, stredné a rozšírené. Preto je vhodné využiť ''WindowSizeClass'' pridaním závosilosti: // libs.version.toml: [versions] adaptive = "1.2.0-alpha06" [libraries] adaptive = { module = "org.jetbrains.compose.material3.adaptive:adaptive", version.ref = "adaptive" } // build.gradle.kts:composeApp kotlin { sourceSets { commonMain.dependencies { implementation(libs.adaptive) }}} ===== Multiplatformové zdroje ===== **CM** poskytuje knižnicu ''compose-multiplatform-resources'' (Gradle) pre prístup k zdrojom v kóde pre podporované platformy. Zdroje sú statický obsah: obrázky, písma a reťazce, použitie vo vlastnej aplikácii. Zdroje sa čítajú synchrónne vo vlákne volajúceho, okrem asynchrónneho čítania pre nespracované súbory a webové zdroje. > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-resources.html|Prehľad zdrojov]] Pôvodná zložka zdrojov pre Android ''res.*'' so zložkami ''drawable'', ''mipmap'', ''values.strings.xml'' je použiteľná len v ''composeApp.kotlin..MainActvity.kt'', teda v MP je treba použiť vlastné zložky a zdroje. Absolutna cesta: ''//composeApp/src/androidMain/res/values/strings.xml''. V Android Studio nie je viditeľná (25sept) zložka zdrojov, avšak je možné ju editovať (Finder). Absolútna cesta: **''//composeApp/src/commonMain/composeResources/values/strings.xml''**, kde ''values/strings.xml'' je manuálne vytvorené. > Tento //XML// je treba editovať v externom editore a po spustení sa jeho obsahom generuje //Class// -> Od CM 1.6.10 a Kotlin 2.0.0 už vygenerovaný projekt zahŕňa potrebné závislosti a zdroje a importy, takže po vytvorení ''.../strings.xml'' sa pri spustení projektu vygeneruje ''composeApp.commonMain.kotlin..composeapp.generated.resources.String0.commonMain.kt'', ktoré [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-resources-usage.html#strings|umožňí import]] v //Composable// funkciách importovať napríklad vlastné stringy : ''import .composeapp.generated.resources.my_string''. Absolutna cesta: ''//composeApp/build/generated/compose/resourceGenerator/kotlin/commonMainResourceAccessors//composeapp/generated/resources/''. \\ Samotný kód potom môže vyzerať takto: ''Text(stringResource(Res.string.my_string))'', kedy tag ''my_string'' je možné používať až po //builde projektu//: //Build -> Assemble project//. \\ Každý string bude mať vlatný import: ''import .composeapp.generated.resources.my_string'' > ! Zložky vlastných zdrojov musia mať názvy: ''drawable'', ''files'', ''font'', ''values'' Trieda **Res.kt** je umiestnená: ''//composeApp.commonMain.kotlin..composeapp.generated.resources.'' == Lokalizácia == jazyková lokalizácia je [[https://www.loc.gov/standards/iso639-2/php/code_list.php|prípona za pomlčkou]] podľa normy ISO 639-1 alebo ISO 639-2, prípadne [[https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2|regionálna prípona]] podľa normy ISO 3166-1-alpha-2 má za ďalšou pomlčkou ''r'', následujúce ''XX'' označenie regiónu (''values-spa-rMX'') * vytvoriť zložku ''values-sk'' v ''//composeApp/src/commonMain/composeResources/'' * skopírovať do nej ''values.xml'' a preložiť * po ''Build -> Assemble project'' bude v ''assets.composeResources'' vytvorená zložka s lokalizáciou Ďaší postup je v odstavci [[kotlin-compose-multiplatform#lokalizacia_retazcov|Lokalizácia reťazcov]]. ===== Životný cyklus ===== Životný cyklus komponentov je prevzatý z konceptu životného cyklu Jetpack Compose. Zároveň poskytuje spoločnú ''LifecycleOwner'' implementáciu, ktorá rozširuje pôvodnú funkcionalitu Jetpack Compose na iné platformy a pomáha sledovať stavy životného cyklu v spoločnom kóde. \\ Závislosť bude v novom projekte už vygenerovaná: ''implementation("org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.9.4")'' \\ Pro použití korutín je ''Lifecycle.coroutineScope'' hodnota viazaná na ''Dispatchers.Main.immediate'' \\ (initial state) (dead state) ┏━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━┓ ┏━━━━━━━━━┓ ┏━━━━━━━━━┓ ┏━━━━━━━━━┓ STAVY ┃ INITIALISED ┃ ┃ DESTROYED ┃ ┃ CREATED ┃ ┃ STARTED ┃ ┃ RESUMED ┃ ┗━━┳━━━━━━━━━━┛ ┗━━┳━━━━━━━━┛ ┗━━┳━━━━━━┛ ┗━━━━┳━━━━┛ ┗━━━━━━┳━━┛ ┃ ON_CREATE ┃ ┃ ┃ ┃ ┣━━━━━━━━━━━━━━━╋━━━━━━━━━━━━▶┃ ON_START ┃ ┃ ┃ ┃ ┃━ ━ ━ ━ ━ ━ ▶┃ ON_RESUME ┃ ┃ ┃ ┃ ┃━ ━ ━ ━ ━ ━ ▶┃ ┃ ┃ ┃ ┃ ┃ UDALOSTI ┃ ┃ ┃ ┃ ON_PAUSE ┃ ┃ ┃ ┃ ON_STOP ┃◄ ━ ━ ━ ━ ━ ▶┃ ┃ ┃ ON_DESTROY ┃◄ ━ ━ ━ ━ ━ ━┃ ┃ ┃ ┃◄ ━ ━ ━ ━ ━ ━┃ ┃ ┃ ┏━━┻━━━━━━━━━━┓ ┏━━┻━━━━━━━━┓ ┏━━┻━━━━━━┓ ┏━━━━┻━━━━┓ ┏━━━━━━┻━━┓ STAVY ┃ INITIALISED ┃ ┃ DESTROYED ┃ ┃ CREATED ┃ ┃ STARTED ┃ ┃ RESUMED ┃ ┗━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━┛ ┗━━━━━━━━━┛ ┗━━━━━━━━━┛ ┗━━━━━━━━━┛ > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-lifecycle.html|Životný cyklus]] ===== ViewModel ===== Bežný ''ViewModel'' z Android je aj pre KMP. \\ Závislosť bude v novom projekte už vygenerovaná: ''implementation("org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.9.4")'' \\ Po deklarácii triedy reprezentujúcej ''ViewModel'' je možné triedu použiť v ''Compose'' funkcii. \\ Pri použití korutín je ''ViewModel.viewModelScope'' hodnota viazaná na ''Dispatchers.Main.immediate'' > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-viewmodel.html|Common ViewModel]] ===== Navigácia v aplikácii KMP ===== Koncept navigácie vyjadruje **Navigačný graf** s **destináciami** a **prepojeniami** medzi nimi. Za **cieľ** sa považuje **uzol**, ktorý reprezentuje iný uzol, vnorený graf, či dialóg. Prejdenie do cieľa vykoná jeho zobrazenie. **Trasa** určuje cieľ a cestu k nemu. \\ Aplikácia reprezentuje cestu a zásobník a spätný zásobník cieľov. Po kroku do cieľa sa tento presunie na začiatok zásobníka, aby bol možný krok späť. Cieľ je možné priradiť **URI** (priamy odkaz). Pri potrebe využiť navigačnú knižnicu je treba pridať závislosť: ''implementation("org.jetbrains.androidx.navigation:navigation-compose:2.9.0")'' : // libs.version.toml: [versions] navigationCompose = "2.9.0" [libraries] navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigationCompose" } // build.gradle.kts:composeApp kotlin { sourceSets { commonMain.dependencies { implementation(libs.navigation.compose) }}} === Deep links === Umožňuje presmerovať na konkrétnu destináciu v príslušnej aplikácii. Môžu byť užitočné aj na získanie externého vstupu do aplikácie (napríklad OAuth). Implementujú sa tak, že najprv sa zaregistrujú, potom definujú cesty k cieľom a nakoniec ich aplikácia spravuje. > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-navigation.html|Navigácia v aplikácii Compose]] > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-navigation-routing.html#setup|Navigácia a smerovanie]] > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-navigation-deep-links.html|Priame odkazy]] - Deep links > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-drag-drop.html|Operácie drag-and-drop]] ===== Testovanie KMP ===== Rozhranie KMP UI pre test volá API ''runComposeUiTestfunkciu'' a testovacie f[[[[http://example.com|Externý odkaz]]]]unkcie sa volajú na ''ComposeUiTest'' prijímači. Pre desktop API je využité ''JUnit''. Pre testovanie sa použije postup: * pridajť zdrojový kód pre testy a potrebné závislosti * napísať a spustite vzorový test * prispôsobenie testu **Bežné testy** sa tvoria a spúšťajú v ''composeApp.commonMain.commonTest.kotlin'' a príkazom v terminály : * **Android** - ''./gradlew :composeApp:connectedAndroidTest'' * **iOS** - ''./gradlew :composeApp:iosSimulatorArm64Test'' * **desktop** - ''./gradlew :composeApp:desktopTest'' * **Wasm** - ''./gradlew :composeApp:wasmJsTest'' > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-test.html|Testovanie KMP]] > Android Developers : [[https://developer.android.com/develop/ui/compose/testing|Test your Compose layou]] ===== Lokalizácia reťazcov ===== KMP ponúka spoločnú knižnicu na správu zdrojov a generovanie kódu pre jednoduchý prístup k prekladom. Pripraviť zdroje treba tak, ako to je vysvetlnie v tomto článku je aj v odstavci [[kotlin-compose-multiplatform#multiplatformove_zdroje|Multiplatformové zdroje]] -> Lokalizácia. Po zostavení KMP spracuje ''strings.xml'' súbory zdrojov ''composeResources'' a vytvorí statické vlastnosti prístupu pre každý reťazcový zdroj: ''Res.strings'', kedy pri použití ''@Composable'' bude j vizualizovaný v IDE. V ''strings.xml'' je možné použiť šablóny pre ''String'' a ''Double'': ''Welcome, %s!'' a v kóde následne volať vložennú premennú ako parameter: ''Text(stringResource(Res.strings.welcome_message, "User"))'' > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-localize-strings.html|Lokalizácia reťazcov]] ==== Regionálne formáty ==== Formátovanie je momentálne implementované pomocou ''kotlinx-datetime'' knižnice. Reprezentujú textové zobrazenia veličín či ich výber (dátum, čas, mena). > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-regional-format.html|Regionálne formáty]] ====== Projekt ====== Po vytvorení kompletného projektu budú v module ''composeApp'' nasledujúce zdrojové sady: * androidMain - (Kotlin/JVM) * commonMain - **zdrojové kódy** (Kotlin) * iosMain - (Kotlin/Native) * jsMain - pre web (Kotlin/JS) * jvmMain - pre desktop (Kotlin/JVM) * wasmJsMain - pre web (Kotlin/Wasm) * webMain - zdroje pre jsMain a wasmJsMain * commonTest - ak sú zahrnuté aj testy Odporúča sa kód špecifický pre platformu písať priamo do jeho zdrojovej sady (nie duplikovať v zdroji). Zdrojový kód začína v: ''composeApp/src/commonMain/kotlin/App.kt'', vo funkcii ''App() { ... }'' > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-create-first-app.html#run-your-application|Spustenie aplikácie]] na Android, iOS, desktop(jvm), Generovanie artefaktov pre web distribúciu : View | Tool Windows | Gradle -> kotlin browser -> jsBrowserDistribution & wasmJsBrowserDistribution => composeApp/build/dist/wasmJs[js]/productionExecutable : > JetBrains Kotlin : [[https://kotlinlang.org/docs/wasm-get-started.html#generate-artifacts|Generate artifacts]] pre Js a Wasm > hotový príklad Js: [[https://regalems.restapi.sk/js]] > hotový príklad Wasm: [[https://regalems.restapi.sk/wasmJs]] (wasmJs nie je funkčné...) Generovanie desktop distribúcie : View | Tool Windows | Gradle -> compose desktop -> createReleaseDistributable => ''~/IdeaProjects//composeApp/build/compose/binaries/main-release/app'' pre macOS je možné skopírovať priamo do Finder | Aplikácie, === Generovanie iných projektov === Projekt mobilnej platformy so **zdieľanou logikou a natívným UI** sa vytvorí definíciou pri vytváraní projektu, napríklad v IJI: * Generators -> Kotlin Multiplatform * [+] Android * [+] iOS [Do not share UI] Po tom je v zložkách následujúce obsadeie: * **shared** - spoločná logika pre Android aj iOS * ''commonMain'' - Interface + Class: ''shared.src.commonMain.kotlin..**.kt**'' * ''androidMain'' - Android Class: ''shared.src.androidMain.kotlin..**.android.kt**'' * ''iosMain'' - iOS Class: ''shared.src.iosMain.kotlin..**.ios.kt**'' * **composeApp** - projekt Android: ''composeApp.src.androidMain.kotlin..**App.kt**'', ale aj Android projekt * **iosApp** - projekt Xcode: ''iosApp.iosApp.Preview Content.**iOSApp.swift**'' + ''**ContentView.swift**'' > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-create-first-app.html#create-a-project|zdieľaná logika a natívné používateľské rozhranie]] ===== Pridanie závislostí ===== Závislosti môžu byť **Multiplatformové**, alebo **Natívne**. Pre oba typy závislostí je možné použiť lokálne aj externé repozitáre. Pre ostré projekty je vhodné zjednodušené cesty v implementáciách rozvinúť do ''.gradle.**libs.versions.toml**'' === kotlinx-datetime === Zabezpečuje operácie s dátumom a časom, pre typmy ako ''Instant'', ''LocalDateTime'' a ''TimeZone''. Po implementácii do ''composeApp/build.gradle.kts'' je nutné synchronizovať Gradle a v terminály IDE spustiť: ./gradlew kotlinUpgradeYarnLock kotlinWasmUpgradeYarnLock > JetBrains KMP: [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-modify-project.html#add-a-new-dependency|pridanie závislosti s DT]] > Klibs.io : [[https://klibs.io/project/Kotlin/kotlinx-datetime|kotlinx-datetime]] ==== KMP závislosti ==== === kotlinx-datetime === === kotlinx.corutines === === kotlinx.serialization === === Ktor === === sqlDelight === * možné a odporúčané je inštalovať plugin **SQLDelight** na prácu so ''.sq'' súbormi v IDE Pridanie závislosti do ''.shared.**build.gradle.kts**'' (IJIdea) : plugins { // json serialization kotlin("plugin.serialization") version "2.2.21" } kotlin { // ktor actual version val ktorVersion = "3.3.1" sourceSets { all { languageSettings.optIn("kotlin.time.ExperimentalTime") } commonMain.dependencies { // date-time implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.7.1") // coroutines implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") // ktor implementation("io.ktor:ktor-client-core:${ktorVersion}") implementation("io.ktor:ktor-client-content-negotiation:${ktorVersion}") // serialization and deserialization implementation("io.ktor:ktor-serialization-kotlinx-json:${ktorVersion}") // set JSON for serialization/deserialization } commonTest.dependencies { implementation(libs.kotlin.test) } androidMain.dependencies { // ktor implementation("io.ktor:ktor-client-android:$ktorVersion") } iosMain.dependencies { // ktor implementation("io.ktor:ktor-client-darwin:$ktorVersion") } } } === podrobné vloženie závislostí === * koin * sqlDelight * lifecycleViewmodelCompose * material3 > JetBrains KMP: [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html#add-gradle-dependencies|MP + Ktor + SQLDelight]], [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-add-dependencies.html|Pridávanie závislostí]] == gradle/libs.versions.toml == [versions] agp = "8.11.2" #// JetBrains say "8.7.3" #// ... coroutinesVersion = "1.10.2" dateTimeVersion = "0.7.1" koin = "4.1.0" ktor = "3.3.1" sqlDelight = "2.1.0" #// lifecycleViewmodelCompose = "2.9.1" # no need (see: androidx-lifecycle = "2.9.5") material3 = "1.3.2" [libraries] #// ... android-driver = { module = "app.cash.sqldelight:android-driver", version.ref = "sqlDelight" } koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutinesVersion" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "dateTimeVersion" } ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" } ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } native-driver = { module = "app.cash.sqldelight:native-driver", version.ref = "sqlDelight" } runtime = { module = "app.cash.sqldelight:runtime", version.ref = "sqlDelight" } #// androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" } androidx-compose-material3 = { module = "androidx.compose.material3:material3", version.ref="material3" } [plugins] #// ... kotlinxSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } sqldelight = { id = "app.cash.sqldelight", version.ref = "sqlDelight" } == shared/build.gradle.kts == plugins { // ... alias(libs.plugins.kotlinxSerialization) alias(libs.plugins.sqldelight) } kotlin { // ... sourceSets { all { languageSettings.optIn("kotlin.time.ExperimentalTime") } iosMain.dependencies { implementation(libs.ktor.client.darwin) implementation(libs.native.driver) } androidMain.dependencies { // ... implementation(libs.ktor.client.android) implementation(libs.android.driver) } commonMain.dependencies { // ... implementation(libs.kotlinx.coroutines.core) implementation(libs.ktor.client.core) implementation(libs.ktor.client.content.negotiation) implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.runtime) implementation(libs.kotlinx.datetime) implementation(libs.koin.core) } } } // ... sqldelight { databases { create("AppDatabase") { packageName.set(".cache") } } } ==== Iné závislosti ==== > vyhľadávacia služba KMP knižníc od JetBrains : [[https://klibs.io/|Klibs.io]] > Kotlin & KMP Dependency Injection Framework : [[https://insert-koin.io/|Koin]] > Kompletný ekosystém pre vývoj moderných API : [[https://www.apollographql.com/|Apollo]] , [[https://www.apollographql.com/docs/what-is-apollo|docs Apollo]] > výkonný HTTP klient (pôvodne [[https://github.com/square/okhttp|OkHTTP]]) : [[https://square.github.io/okio/|Okio]] , [[https://square.github.io/okio/multiplatform/|Multiplatform]] ---- // **omitted:**\\ * [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-integrate-in-existing-app.html|Android => Android(AndroidStudio) + iOS(Xcode)]], add shared module commonMain & iosMain // ---- ===== SQLDelight ===== Je vhodné nainštalovať plugin SQLDelight do IDE, ako je vyššie uvedené. Potom budú ponúkané automaticky rôzne časti štruktúry projektu a kódu. V odkaze na JB Konfigurácia SQLDelight je presný postup ako vytvoriť štruktúru zložiek a pridať súbory pre operácie s DB. Taktiež v ľavom rámci IDE je dostupný doplnok SQLDelight, Po vytvorení súborov sa v terminále spustí: (prípadne použiť panel: ''Gradle->->Tasks->sqldelight->generateCommonMainAppDatabaseInterface'') ./gradlew generateCommonMainAppDatabaseInterface čo vygeneruje štruktúru a kódy do : ''shared/build/generated/sqldelight'' > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html#configure-sqldelight-and-implement-cache-logic|Konfigurácia SQLDelight]] > JetBrains Marketplace : [[https://plugins.jetbrains.com/plugin/8191-sqldelight?_gl=1%2Auultk9%2A_gcl_aw%2AR0NMLjE3NjE5MDQ3MDEuQ2owS0NRand2SkhJQmhDZ0FSSXNBRVFuV2xCaDlfRGR3LWlQYUlBYmMzSFVfTWU1b3pybXB0WkxsWmFQcU10YnYybWhxT1pxenZKN2FHQWFBc21vRUFMd193Y0I.%2A_gcl_au%2AODgzMTQxOTQ3LjE3NjEyMTk0MjM.%2AFPAU%2AMjExNjgyNzIyNy4xNzU3MDU4NzMw%2A_ga%2AMTU0NjM2NzIxNC4xNzQ0NDAzMDcy%2A_ga_9J976DJZ68%2AczE3NjIyNjIwNzAkbzk0JGcwJHQxNzYyMjYyMDcwJGo2MCRsMCRoMA..|SQLDelight]] > JetBrains KMP : [[https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-ktor-sqldelight.html#create-the-ios-application|Vytvorenie aplikácie pre iOS - sqlite3]]