Annyce Davis - @brwngrldev
Musings on Kotlin Multiplatform Mobile
January 2021
Slide 2
Slide 2 text
@brwngrldev
Slide 3
Slide 3 text
@brwngrldev
Slide 4
Slide 4 text
@brwngrldev
Slide 5
Slide 5 text
My journey
How I got started with KMM
1. Attended an AMA
2. Started following devs on Twitter
3. Pulled down a sample app
4. Wrote a sample app
5. Read documentation
6. Watched videos on YouTube
@brwngrldev
Slide 6
Slide 6 text
After the AMA
I finally started to get it!
K
otlin
K
otlin/N
ative
K
M
P
K
M
M
@brwngrldev
Slide 7
Slide 7 text
Twitter friends
What are folks up to with KMM
@brwngrldev
Architecture
Created with KMM plugin
Data model API
Repository Dependency Injection
Shared code
Todo App
iOS Project Android Project
@brwngrldev
Slide 11
Slide 11 text
Data model
Kotlinx Serialization
@Serializable
data class Todo(
@SerialName("id")
val id: Int,
@SerialName("title")
val title: String,
@SerialName("completed")
val completed: Boolean
)
@brwngrldev
Slide 12
Slide 12 text
API
Ktor
private val httpClient = HttpClient {
install(JsonFeature) {
val json = Json { ignoreUnknownKeys = true }
serializer = KotlinxSerializer(json)
}
}
override suspend fun getAllTodos(): List {
return httpClient.get(ENDPOINT)
}
@brwngrldev
Slide 13
Slide 13 text
Repository
Koin and Kermit
private val api: TodosApi by inject()
private val logger: Kermit by inject()
private val todos: MutableList = mutableListOf()
@brwngrldev
Slide 14
Slide 14 text
Repository
Koin and Kermit
private val api: TodosApi by inject()
private val logger: Kermit by inject()
private val todos: MutableList = mutableListOf()
@Throws(Exception::class)
suspend fun getAllTodos(forceReload: Boolean): List {
logger.i{ "loading todos" }
return if (todos.isNotEmpty() && !forceReload) {
todos
} else {
api.getAllTodos().also {
todos.clear()
todos.addAll(it)
}
}
}
@brwngrldev
Slide 15
Slide 15 text
Wasn’t all roses
• Struggled with using Koin in the
iOS app
• Couldn’t figure out how to use
the Kermit logger in the iOS app
• Android Studio would misbehave
often
• I didn’t know any SwiftUI
Challenges
Slide 16
Slide 16 text
How does KMM compare?
@brwngrldev
Slide 17
Slide 17 text
Comparison
Standard/KMM/Flutter
Standard KMM Flutter
Language
Learning Curve
Maturity
Platform UI
Community
@brwngrldev
Slide 18
Slide 18 text
Comparison
Standard/KMM/Flutter
Standard KMM Flutter
Language ⭐⭐ ⭐⭐ ⭐
Learning Curve
Maturity
Platform UI
Community
@brwngrldev
Slide 19
Slide 19 text
Comparison
Standard/KMM/Flutter
Standard KMM Flutter
Language ⭐⭐ ⭐⭐ ⭐
Learning Curve ⭐⭐ ⭐⭐ ⭐
Maturity
Platform UI
Community
@brwngrldev
Slide 20
Slide 20 text
Comparison
Standard/KMM/Flutter
Standard KMM Flutter
Language ⭐⭐ ⭐⭐ ⭐
Learning Curve ⭐⭐ ⭐⭐ ⭐
Maturity ⭐⭐ ⭐
Platform UI
Community
@brwngrldev
Slide 21
Slide 21 text
Comparison
Standard/KMM/Flutter
Standard KMM Flutter
Language ⭐⭐ ⭐⭐ ⭐
Learning Curve ⭐⭐ ⭐⭐ ⭐
Maturity ⭐⭐ ⭐
Platform UI ⭐⭐ ⭐⭐ ⭐
Community
@brwngrldev
Slide 22
Slide 22 text
Comparison
Standard/KMM/Flutter
Standard KMM Flutter
Language ⭐⭐ ⭐⭐ ⭐
Learning Curve ⭐⭐ ⭐⭐ ⭐
Maturity ⭐⭐ ⭐
Platform UI ⭐⭐ ⭐⭐ ⭐
Community ⭐⭐
@brwngrldev
Slide 23
Slide 23 text
Community
@brwngrldev
Slide 24
Slide 24 text
@brwngrldev
Slide 25
Slide 25 text
Mascot
KroN Kira the Nightingale
Meant for illustration purposes
@brwngrldev
Slide 26
Slide 26 text
Libraries
Official listing from JetBrains
https://github.com/AAkira/Kotlin-Multiplatform-Libraries
@brwngrldev
Slide 27
Slide 27 text
Video tutorials
(see Boring Flutter show)
@brwngrldev
Slide 28
Slide 28 text
Recommendations
How to get more folks into KMM
• Mascot (Kron or Kira)
• Listing of available libraries
• Social media tips (Multiplatform Mondays)
• YouTube content from a variety of creators
• More codelabs
• Partner with existing groups of iOS and Kotlin influencers
• Weekly office hours
@brwngrldev