Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Compose Multiplatform in produktiven Projekten?

Wolfram Rittmeyer
September 16, 2024
5

Compose Multiplatform in produktiven Projekten?

Seit seiner Ankündigung hat Compose Multiplatform einen großen Schritt nach vorne gemacht. In diesem Vortrag stellt Euch Wolfram Rittmeyer vor, was mit diesem UI-Framework inzwischen alles möglich ist. Dabei gibt er Empfehlungen zum Aufsetzen des Projekts, zur Strukturierung der Code-Basis und dazu, wie gemeinsame UI-Logik umgesetzt wird bzw. wie man mit abweichenden Logiken umgeht, die sich aufgrund von Plattform-Unterschieden ergeben.

Kann Compose Multiplatform schon in produktiven Projekten genutzt werden? Oder wo gibt es eventuell noch Probleme? Was ist mit Tests der UIs, wie sieht es mit Screenshot-Tests aus? Am Schluss dieses Talks wisst Ihr genau, worauf Ihr achten müsst, wenn Ihr Compose Multiplatform produktiv nutzen wollt.

Wolfram Rittmeyer

September 16, 2024
Tweet

Transcript

  1. Icons  App Icon Plugin  Erzeugt aus einem Icon

    App Icons für iOS und Android  Vorlage: PNG oder SVG https://github.com/qamarelsafadi/KMPAppIconGeneratorPlugin
  2. expect / actual  Deklaration mit expect  Implementation mit

    actual  Für Funktionen, Objekte, Enums und Properties – Für Klassen in Beta  Müssen im gleichen Package liegen – In den jeweiligen Sourcesets
  3. Interfaces mit DI  Erzeuge ein Interface  Implementiere entsprechend

    je nach Plattform  Besser für komplexe Dinge  Zudem Teilen von Implementierung – z.B. Android und Desktop
  4. Ressourcen  Gemeinsamer Ressourcenzugriff auf – Bilder • Vektor- und

    Bitmap-Images – Texte – Dateien – Schriftarten
  5. Tests  UI Tests seit Compose MP 1.6 möglich 

    Analog zu Android Compose Tests
  6. Tests  UI Tests seit Compose MP 1.6 möglich 

    Analog zu Android Compose Tests  Logik-Tests mit Junit und Ui-Tests zugleich problemlos  Kotest-Test hingegen nur mit Task jvmTest möglich
  7. Modularisierung  Zudem kann man Module nicht beliebig anlegen 

    Dazu gibt es eine ziemlich lange Doku: https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-project-configuration.html
  8. Konfiguration  BuildKonfig https://github.com/yshrsmz/BuildKonfig  Macht einen sehr guten Eindruck

     Unterstützt Flavors (mittels Properties) – gradle.properties oder – ./gradlew build -Pbuildkonfig.flavor=release
  9. Konfiguration  Beide absolut vergleichbar – Alter, Beitragende, Github Forks-

    und Stars – Abweichung in Versioning-Policy • BuildKonfig nutzt 0.15.1, BuildConfig hingegen 5.3.5
  10. Konfiguration  Mit BuildConfig/BuildKonfig + DI eigene Varianten  Mit

    Interfaces  Und Injektion der Implementierung je nach Variante
  11. Konfiguration  Mit BuildConfig/BuildKonfig + DI eigene Varianten  Mit

    Interfaces  Und Injektion der Implementierung je nach Variante  Anderes Handling aber mehr Übersicht
  12. Kotlin – Swift Zusammenspiel  Compilation nicht zu Swift sondern

    zu Objective-C  Von da dann nutzbar von Swift aus – Typinformationen können verloren gehen (Generics mit Interfaces)
  13. Kotlin – Swift Zusammenspiel  Compilation nicht zu Swift sondern

    zu Objective-C  Von da dann nutzbar von Swift aus – Typinformationen können verloren gehen (Generics mit Interfaces)  Coroutinen und Flows funktionieren nicht wie erwartet
  14. Kotlin – Swift Zusammenspiel  Compilation nicht zu Swift sondern

    zu Objective-C  Von da dann nutzbar von Swift aus – Typinformationen können verloren gehen (Generics mit Interfaces)  Coroutinen und Flows funktionieren nicht wie erwartet – Callbacks – Error Handling – Cancelation
  15. Kotlin – Swift Zusammenspiel  Zum Glück gibt es Bibliotheken

    / Plugins – KMP-NativeCoroutines https://github.com/rickclephas/KMP-NativeCoroutines – SKIE (Swift Kotlin Interface Enhancer) https://skie.touchlab.co/  Sehr gute Artikelserie https://medium.com/@aoriani/list/writing-swiftfriendly-kotlin-multiplatform-apis-c51c2b317fce
  16. Tooling  Wie früher als Compose bei Android neu war

     Alles noch ein wenig wackelig  Kein UI Editor
  17. Tooling  Previews sind möglich – Aber nur in Fleet

     LayoutInspector funktioniert wie immer  App Inspection funktioniert ebenso wie immer – Database Inspector – Network Inspector
  18. KMP rules  Die einzige Option um – Logik zwischen

    iOS und Android zu teilen – Aber eine native UI zu behalten
  19. KMP rules „(…) our initial focus is sharing the business

    Logic the part of the code that's most agnostic to the user“ What's new in Android, Google I/O https://www.youtube.com/watch?v=_yWxUp86TGg
  20. Aber was ist mit Compose?  Besonders dann geeignet wenn

    – Deine App eine eigenständige UI hat • Zumindest für Teile der App – Oder Du ein Solo-Dev bist • Dem iOS aber nicht so wichtig ist :-) • Oder wenn doch: Der eine eigenständige UI nutzt
  21. Aber was ist mit Compose?  Besonders dann geeignet wenn

    – Deine App eine eigenständige UI hat • Zumindest für Teile der App – Oder Du ein Solo-Dev bist • Dem iOS aber nicht so wichtig ist :-) • Oder wenn doch: Der eine eigenständige UI nutzt – Deine App noch nicht bald released wird
  22. Libs als Hilfe  compose-cupertino – Wrapper für alle Komponenten

    – AdaptiveTopAppBar, AdaptiveNavigationBar...  Calf (Compose Adaptive Look & Feel) – gute Lösung vor allem für kritische Komponenten – Zum Beispiel Dialoge, Datepicker...
  23. Aber dennoch „It looks awfully similar, but it’s not the

    same. Sometimes imitation is so good that your user is not aware of the problem. However the user’s dog is not fooled and will bark at these buttons, because they’re just not quite right.“ https://ericsink.com/bos/Platforms.html
  24. Aber dennoch „In fact, if we’re going to participate in

    platform decisions as geeks with a touch of business clue, there is only one concept we have to learn: It's all about the user.“ https://ericsink.com/bos/Platforms.html
  25. Netflix  Ktor Client für Netzwerkzugriff  SQLDelight zum Cachen

    „Almost 50% of the production code in our Android and iOS apps is decoupled from the underlying platform“ https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23
  26. McDonalds  Nutzt KMP im Repository und im Usecase Layer

     Netzwerkzugriff noch nativ  Planen, KMP-Bereich mehr und mehr auszuweiten https://medium.com/mcdonalds-technical-blog/mobile-multiplatform-development-at-mcdonalds-3b72c8d44ebc
  27. Meetup  Apollo Graph QL für den Backend-Zugriff  SQLDelight

    als DB  Repository Layer  Interactor / UseCase Layer  Koin für DI https://medium.com/making-meetup/adopting-kotlin-multiplatform-mobile-kmm-at-meetup-326b2b0a4186 https://www.youtube.com/watch?v=GtJBS7B3eyM
  28. Instabee  Compose Multiplatform  Ktor Client (kotlinx Serialization /kotlinx

    DateTime)  multiplatform-settings  Compose Cupertino  Voyager für navigation https://medium.com/making-meetup/adopting-kotlin-multiplatform-mobile-kmm-at-meetup-326b2b0a4186 https://www.youtube.com/watch?v=GtJBS7B3eyM
  29. Google  Starker Fokus auf KMP bei der Google I/O

    24  Dokumentation  Libraries  Und mehr und mehr der eigenen Apps nutzen es
  30. Scaling is hard „Piloting Kotlin Multiplatform is Easy. Scaling is

    Hard.“ https://touchlab.co/kmp-teams-piloting-vs-scaling
  31. Pictures / Licenses 1: Background of title slide shows a

    small section of a photo by Romain Guy: https://www.flickr.com/photos/romainguy/48539281152 2: Jetpack Compose logo: https://developer.android.com/jetpack/compose 3: Coffee bean and ground coffee by Tamas Pap: https://unsplash.com/photos/brown-and-black-stones-in-close-up-photography-RJPrJQXlmng 4: Cups by Annie Spratt: https://unsplash.com/photos/white-ceramic-mortar-and-pestle-QOBHnWEg-mk 5: Knobs by Adi Goldstein: https://unsplash.com/photos/black-audio-equalizer-HLS7GQ0BCOQ 6: Drawers by Jan Antonin Kolar: https://unsplash.com/photos/brown-wooden-drawer-lRoX0shwjUQ 7: Adapter by Call Me Fred: https://unsplash.com/photos/two-white-power-adapters-on-white-background-nBfTARHPxiU 8: Album by Rirri: https://unsplash.com/photos/photos-on-white-wooden-table-z4KhbVhPP7s 9: Computer / Discussion by Scott Graham: https://unsplash.com/photos/person-holding-pencil-near-laptop-computer-5fNmWej4tAA 10: iOS / Android abomination by Tsahi Levent-Levi: https://unsplash.com/photos/sL2BRR1cuvM 11: Company Spiral by Sven Read: https://unsplash.com/de/fotos/grascale-photo-of-spiral-stairs-8p17jXyfIQQ 12: Investigation by Mediamodifier: https://unsplash.com/de/fotos/black-magnifying-glass-on-white-paper-yx17UuZw1Ck 13: Final Coffee by Fahmi Fakhrudin: https://unsplash.com/photos/person-making-latte-art-nzyzAUsbV0M 14: Slide design "Fedora Photography" by Liam Doherty: https://github.com/dohliam/libreoffice-impress-templates/tree/master/fedora-slideshow/fedora-photography Licenses: 1: Public Domain 2: CC Attribution 2.5 3, 4, 5, 6, 7, 8, 9, 11, 12, 13: Unsplash License 10: CC BY 2.0 DEED 14: MIT License