Wetter-App übernehmen

30 MinutenDie Android-Wetter-App in KMP zum Laufen bringen

Abhängigkeiten

WofürBibliothekSource Set
Navigation 3org.jetbrains.androidx.navigation3:navigation3-uicommonMain
Serializationkotlinx-serialization-core + PlugincommonMain
HTTPKtor Client, Content Negotiation, JSONcommonMain
HTTP-Enginektor-client-okhttp / ktor-client-darwinandroidMain / iosMain
ViewModel, Lifecycleschon vom Wizard eingebundencommonMain

Code kopieren

  1. model/, data/ und ui/ (mit ui/theme) aus schritt-10 nach shared/src/commonMain/kotlin/… kopieren
  2. Paketnamen in package und Imports ersetzen (weatherandroidtif24 → weatherkmptif24)
  3. App() zeigt die Wetter-App
@Composable
fun App() {
    WeatherAndroidTIF24Theme {
        WeatherApp()
    }
}

Was nicht mehr kompiliert

Alles, was es nur unter Android oder auf der JVM gibt:

StelleErsatz
HttpClient(OkHttp)HttpClient { … }, Engine pro Plattform
java.io.IOExceptionkotlinx.io.IOException
"%.2f".format(…)String-Template
Dynamic Color im Themefeste Farben
Preview mit uiModeTheme mit darkTheme = true

Navigation 3 ohne Reflection

private val navConfig = SavedStateConfiguration {
    serializersModule = SerializersModule {
        polymorphic(NavKey::class) {
            subclass(CityList::class, CityList.serializer())
            subclass(CityWeather::class, CityWeather.serializer())
        }
    }
}

val backStack = rememberNavBackStack(navConfig, CityList)

Kompiliert, stürzt aber ab

Unter iOS stürzt die App beim Start ab:

UnsupportedOperationException: `Factory.create(String, CreationExtras)` is not implemented.
// WeatherApp
val weatherViewModel = viewModel { WeatherViewModel() }
// WeatherScreen (Default-Parameter)
viewModel: WeatherViewModel = viewModel { WeatherViewModel() },

Was gleich bleibt

  • Von gut 600 Zeilen Kotlin ändern sich 6 Dateien mit rund 40 Zeilen
  • ViewModel, Repositorys, DTOs: unverändert
  • Composables: nur einzelne Zeilen geändert
  • Der Grund für fast jede Änderung: Android-APIs und Reflection gibt es auf iOS nicht