>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Kotlin

Jak jeden projekt Kotlin obejmuje Android, iOS, Web, Wear OS i agentów AI

Gdy chcesz zaprezentować możliwości Kotlin Multiplatform na realnym kodzie, łatwo utknąć w złożonej architekturze i dziesiątkach warstw abstrakcji. John O'Reilly wybrał inne podejście. Zdecydował się na proste zadanie: wyświetlanie listy osób na orbicie oraz współrzędnych ISS. Rezultatem jest klarowny przykład tego, jak pojedynczy moduł logiki biznesowej działa na tuzinie różnych platform.

Projekt znalazł się w oficjalnej dokumentacji Kotlin oraz w Google Dev Library. Przyjrzyjmy się, jak wszystko jest zorganizowane i dlaczego ten kod stanowi wygodne środowisko do eksperymentowania.

Na czym polega projekt

Aplikacja pobiera dane z dwóch otwartych źródeł. Lista astronautów wraz z biografiami pochodzi z The Space Devs API, natomiast współrzędne ISS są pobierane przez Open Notify API. Aby chronić klientów przed bezpośrednim obciążaniem usług zewnętrznych, repozytorium zawiera niewielkie backendowe rozwiązanie oparte na Ktor.

Główna idea to deduplikacja kodu. Logika biznesowa, żądania sieciowe, cache'owanie i modele danych są pisane raz w współdzielonym module common. Ten kod następnie łączy się z klientami kierowanymi na najróżniejsze systemy operacyjne i ekrany.

Lista obsługiwanych celów obejmuje:

  • Smartfony z Androidem i widżety na ekranie głównym z wykorzystaniem Glance API
  • Aplikacja iOS zbudowana w SwiftUI
  • Zegarki z systemem Wear OS
  • Wersja desktopowa poprzez Compose for Desktop
  • Klient webowy z wykorzystaniem Kotlin/Wasm
  • Komponent serwerowy z Ktor
  • Serwer MCP do łączenia z klientami AI

Co kryje się pod maską współdzielonego modułu

Moduł common zajmuje się całą żmudną pracą. Wykorzystuje biblioteki dobrze znane programistom Kotlina:

  • Ktor Client obsługuje żądania sieciowe
  • SQLDelight dba o lokalne przechowywanie danych w bazie
  • Koin zajmuje się wstrzykiwaniem zależności
  • Kotlinx Serialization parsuje JSON

Compose Multiplatform oraz biblioteka SKIE odpowiadają za komunikację z interfejsem użytkownika. Ta druga znacząco upraszcza pracę ze Swift, tłumacząc korutyny i Flow na koncepcje asynchroniczne zrozumiałe dla programistów iOS.

class PeopleInSpaceViewModel(
    private val peopleInSpaceRepository: PeopleInSpaceRepositoryInterface
) : KMMViewModel() {

    val peopleInSpace: StateFlow<List<Assignment>> = 
        peopleInSpaceRepository.fetchPeopleAsFlow()
            .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}

Dzięki temu podziałowi klienci platformowi pozostają szczupli. zajmują się tylko renderowaniem interfejsu i obsługą dotyku użytkownika.

Od inteligentnych zegarków do przeglądarki internetowej

Każdy klient w repozytorium jest zorganizowany jako osobny moduł. Dzięki temu łatwo szybko zrozumieć, jak konkretna technologia integruje się ze współdzielonym kodem KMP.

Aplikacja na Androida jest zbudowana przy użyciu Jetpack Compose. Obok niej znajduje się moduł wearApp, gdzie interfejs jest dostosowany do okrągłych ekranów zegarków z wykorzystaniem Compose for Wear OS. Znajdziesz tam również działający widżet na ekranie głównym Androida napisany z użyciem Glance API.

Wear OS person list Wear OS edge button Wear OS ISS map

W przypadku iOS autor oferuje dwie ścieżki: klasyczny interfejs SwiftUI lub współdzielony kod Compose. Wybór należy do programisty.

iOS UI

Wersja przeglądarkowa jest zbudowana z wykorzystaniem Kotlin/Wasm. Proces budowania uruchamia się poprzez standardowe zadanie Gradle, tworząc działający frontend bez konieczności pisania jakiegokolwiek JavaScriptu.

Compose for Web Wasm

Łączenie z Claude Desktop przez MCP

Jedną z najnowszych dodatków do repozytorium jest moduł mcp-server. Autor zaimplementował serwer wykorzystujący Model Context Protocol wraz z oficjalnym Kotlin MCP SDK.

Idea jest taka, że ten sam moduł common zawierający logikę biznesową i warstwę sieciową trafia do aplikacji konsolowej. Ta aplikacja udostępnia narzędzia dla sztucznej inteligencji. Uruchamiając lokalny serwer, można połączyć go z Claude Desktop lub innym asystentem.

Konfiguracja dla Claude Desktop wygląda następująco:

{
  "mcpServers": {
    "kotlin-peopleinspace": {
      "command": "java",
      "args": [
        "-jar",
        "/path/to/repo/mcp-server/build/libs/serverAll.jar",
        "--stdio"
      ]
    }
  }
}

Po tym sieć neuronowa uzyskuje bezpośredni dostęp do funkcji pobierania danych i może odpowiadać na pytania o kosmonautów, pobierając świeże informacje z Twojego kodu KMP.

MCP integration

Dlaczego warto zajrzeć do tego repozytorium

Repozytorium PeopleInSpace jest cenne nie ze względu na skalę kodu, ale na aktualny stos technologiczny. Autor stale aktualizuje wersje Kotlina, Gradle, Compose i powiązanych bibliotek.

Projekt stanowi dobrą referencję, jeśli planujesz:

  1. Oszacować, ile kodu faktycznie możesz ponownie wykorzystać między Androidem a iOS.
  2. Zobaczyć Kotlin/Wasm działający w przeglądarce w praktyce.
  3. Zrozumieć, jak działa SKIE podczas przekazywania strumieni danych do Swift.
  4. Poznać budowanie serwerów MCP z wykorzystaniem Kotlina.

Aby rozpocząć, wystarczy sklonować repozytorium, otworzyć je w najnowszej wersji Android Studio i uruchomić wybrane zadanie Gradle.

Powiązane projekty