Cosa è Kotlin Multiplatform

Cosa è Kotlin Multiplatform

Kotlin Multiplatform (KMP) è una tecnologia che consente agli sviluppatori di utilizzare Kotlin per sviluppare la stessa applicazione su più piattaforme, come Android, iOS, Desktop e Web.

Le applicazioni sviluppate utilizzando KMP possono ottenere la condivisione del codice sia sulla logica aziendale che sull’interfaccia utente .

La nascita e la crescita del progetto Kotlin Multiplatform (KMP)

Il progetto è iniziato intorno al 2017 ed è stato annunciato durante la KotlinConf con il supporto per JVM, Native e JS.

Nel 2020 l’SDK ha raggiunto una fase sperimentale e l’attenzione si è spostata per garantire una migliore interoperabilità tra iOS e Android, a causa del grande interesse da parte della community.

La piattaforma multipiattaforma Kotlin sta crescendo molto rapidamente ed è già utilizzata in alcune aziende come McDonald’s, Forbes, Philips e altre che utilizzano KMP per condividere l’80% della logica aziendale.

Come funziona KMP?

KMP si basa sulla capacità di Kotlin di essere convertito e diventare completamente operativo su diverse piattaforme come Android o iOS.
Nell’ambiente Android Kotlin viene convertito in bytecode e poi eseguito dalla JVM.

Per le piattaforme che non sfruttano JVM, come iOS, il bytecode generato non può funzionare, quindi è necessario convertirlo. Questo processo viene eseguito tramite Kotlin-Compiler.

Il compilatore Kotlin ha 2 livelli diversi:

  1. Interfaccia utente
  2. Backend

Il livello Frontend converte il codice in IR (Rappresentazione Intermedia).

Il livello Backend converte questo IR nel codice eseguibile corrispondente a seconda della piattaforma. Questo livello è dove avviene la magia.
Ad esempio in Android viene convertito in Java Bytecode, per iOS in codice macchina nativo.

Questa conversione da IR a codice di piattaforma specifico è possibile grazie al compilatore Kotlin/Native. Questo compilatore usa una toolchain LLVM per convertire primitive Kotlin, classi e diverse strutture di programmazione in quella specifica.

Per riassumere KMP funziona così.

Kotlin -> Rappresentazione intermedia (IR) -> Codice eseguibile nativo

Nella documentazione ufficiale di KotlinNative è possibile trovare tabelle che rappresentano la mappatura del codice Kotlin nei diversi linguaggi.

Ad esempio, un’interfaccia Kotlin è rappresentata come protocollo in Swift e @protocl in Objective C

Creazione di un progetto KMP

Per creare un progetto KMP ci sono alcune differenze rispetto a un progetto Android standard.

È necessario creare un progetto con KMP Wizard, un sito web che offre la possibilità di impostare un progetto KMP da un modello e poi scaricarlo e aprirlo in Android Studio.

Qui puoi selezionare il tipo di progetto KMP, la piattaforma e se l’interfaccia utente verrà condivisa o meno.

Dopo averlo fatto, scarica il progetto e aprilo con Android Studio.

NOTA
Per lavorare con KMP per Android e iOS è necessario avere installato non solo Android Studio ma anche Xcode e almeno un dispositivo simulatore.

Struttura del progetto

Una volta scaricato, passa in Android Studio alla visualizzazione Progetto e la struttura apparirà così:

composeApp (le app Android sono realizzate con JetpackCompose per impostazione predefinita)
applicazione iOS
condiviso .
Il modulo condiviso è quello in cui verrà definita tutta la logica comune.

Espandendo il modulo condiviso, le sottocartelle appaiono come segue:

In commonMain è possibile scrivere codice di piattaforma comune, mentre nel suo modulo specifico possiamo implementare codice specifico della piattaforma.

Come?

Codice condiviso

Uno dei punti di forza di KMP rispetto ad altre soluzioni multipiattaforma è l’agilità e la semplicità di implementazione di codice sia comune che specifico.

Per creare codice condiviso, è sufficiente creare un file in Kotlin sotto il modulo commonMain come una classe:

import kotlin.random.Random
class Greeting {
    private val platform: Platform = getPlatform()

    fun greet(): String {
        val firstWord = if (Random.nextBoolean()) "Hi!" else "Hello!"
        return "$firstWord Guess what this is! > ${platform.name}!"
    }

    fun wave(): List<String> = buildList {
        add(if (Random.nextBoolean()) "Good morning!" else "God Night!")
        add("Jhonny")
        add(NewYear().dayPhrase())
    }
}

È possibile quindi utilizzare Greeting().wave() nella nostra composeApp.

E nella nostra iosApp, espandendo il modulo iosApp è possibile trovare una cartella chiamata:
iosApp.xcodeproj.

Facendo clic con il tasto destro è possibile aprirlo in Xcode e quindi utilizzare la classe Greeting.

Tutto il codice comune condiviso viene compilato come libreria, quindi è possibile utilizzare tutte le classi e i metodi condivisi.

let phrases = Greeting().wave()
VStack(spacing: 16) {
    Image(systemName: "swift")
        .font(.system(size: 200))
        .foregroundColor(.accentColor)
    Text("SwiftUI: \(Greeting().greet())")
}

A volte creare un’app su piattaforme diverse può sembrare complicato, ma dopo la configurazione su Xcode con almeno un simulatore installato il processo è piuttosto semplice.

Basta andare alla scheda di configurazione in Android Studio.
Crea un nuovo dispositivo per iOS, seleziona un dispositivo simulatore e poi è possibile avviare il progetto.

In ogni caso, si consiglia di lavorare principalmente con Android Studio e di avviare anche l’applicazione iOS dalla scheda delle configurazioni.

Codice specifico della piattaforma

Anche il codice specifico della piattaforma è molto semplice. È possibile creare semplicemente un’interfaccia e dichiararla con la parola chiave expect.

In questo modo l’IDE informerà automaticamente che sono necessarie implementazioni specifiche per ciascuna piattaforma supportata dal progetto.

Dopo aver selezionato le piattaforme su cui mancava l’implementazione, verranno generati file specifici per ciascuna piattaforma.

Si noti che la parola chiave effettiva specifica che getPlatform non è una funzionalità comune, bensì una funzionalità specifica di una piattaforma.

Creare codice specifico può ovviamente creare più lavoro rispetto ad averne uno condiviso.
Il codice specifico della piattaforma deve essere creato quando non ci sono librerie KotlinNative che offrono la possibilità di avere un codice condiviso.

Le librerie KotlinMultiplatform stanno aumentando in numero e qualità molto rapidamente, ma avere un codice specifico sarà sempre utile per mantenere alta qualità e prestazioni per un caso d’uso particolare. A seconda delle esigenze è possibile quindi scegliere di implementare un codice condiviso comune o uno specifico della piattaforma.

Componi multipiattaforma

Kotlin multipiattaforma è una soluzione Kotlin per la creazione di un’interfaccia utente comune per

Applicazioni Android
App iOS
Sito web
Desktop
Per fare ciò è necessario utilizzare Compose multipiattaforma.

Compose multipiattaforma si basa sulla libreria Jetpack Compose, un sistema di sviluppo di interfacce utente dichiarative che utilizza Kotlin.

Attualmente è in una fase molto iniziale sia per iOS che per Web.
Molte librerie importanti sono mancanti, sono sperimentali o create dalla comunità.

Usarlo in un progetto di produzione potrebbe essere rischioso. Attualmente esiste una piccola comunità e molte librerie non ufficiali per la maggior parte dei casi d’uso, ma ovviamente non c’è garanzia che queste librerie saranno mantenute e aggiornate.

Di recente, durante Google I/O 2024, sono state annunciate numerose nuove librerie per la piattaforma multipiattaforma Compose.

· Navigazione compose: Navigazione classica con compose funzionante sia per iOS che per Android. Attualmente ci sono limitazioni come gesture backhander e deeplinking

· Room : il database Room è una soluzione standard classica per la creazione di database nello sviluppo Android. Ora è disponibile in KMP

· Data store: Data store è un’evoluzione moderna di SharedPreference di Android, ora disponibile in KMP per archiviare dati semplici per le applicazioni.

È importante ricordare che alcune librerie sono sperimentali e potrebbero cambiare drasticamente. Ulteriori informazioni possono essere trovate nella documentazione ufficiale sia per Compose Multiplatform che per Kotlin Multiplatform

È possibile quindi aspettarsi che il numero di librerie e la loro stabilità aumentino nel corso del 2024, rendendo KMP una soluzione più adatta.

Conclusioni Kotlin Multiplatform (KMP)

KMP non è solo una ” nuova soluzione multipiattaforma ” come Flutter o ReactNative perché è possibile decidere di condividere solo la logica di business senza impattare sullo sviluppo dell’interfaccia utente.

È possibile quindi avere un’unica fonte per tutta la logica aziendale (un unico codice da gestire, testare e aggiornare), mantenendo lo stesso approccio per la creazione dell’interfaccia utente.

Lavorare con Kotlin multipiattaforma richiede un’elevata conoscenza di Kotlin, ma se deve essere utilizzato per lo sviluppo mobile è anche necessario comprendere l’ambiente iOS, come utilizzare Xcode durante il processo di debug, le librerie, la configurazione del simulatore e altro ancora.

L’SDK sta crescendo rapidamente e vengono rilasciate più librerie che offrono maggiori possibilità di condividere più codice sia per la logica che per l’interfaccia utente.

In questa fase, utilizzarlo per condividere il codice della logica aziendale è già una soluzione stabile, per il futuro è possibile aspettarsi che anche il codice di condivisione dell’interfaccia utente diventi più efficiente.

(fonte)

Innovaformazione, scuola informatica specialistica promuove la cultura dello sviluppo app mobile consapevole. Nell’offerta formativa rivolta alle aziende trovate anche il Corso Kotlin .

INFO: info@innovaformazione.net – tel. 3471012275 (Dario Carrassi)

Ti potrebbe interessare

Articoli correlati