$30 off During Our Annual Pro Sale. View Details »

Kotlin First - Taking Advantage of Kotlin for Android Development // 360AnDev 2020

Kotlin First - Taking Advantage of Kotlin for Android Development // 360AnDev 2020

What does it mean to be "Kotlin First"?

How can you start taking full advantage of Kotlin for Android development?

Nate Ebel

July 23, 2020
Tweet

More Decks by Nate Ebel

Other Decks in Programming

Transcript

  1. Kotlin First
    Taking Full Advantage of Kotlin for

    Android Development
    ANDROID DEVELOPER
    @n8ebel www.goobar.io
    Nate Ebel

    View Slide

  2. Kotlin
    First

    View Slide

  3. How can

    we take full

    advantage of Kotlin?

    View Slide

  4. Taking Full Advantage of Kotlin
    Migrating

    Java
    Syntax

    &

    Features
    Kotlin

    Standard

    Library
    Coroutines

    &

    Flow
    Jetpack

    Compose
    Kotlin

    Multiplatform

    View Slide

  5. Taking Full Advantage of Kotlin
    New To Kotlin Kotlin Practitioner Kotlin Veteran

    View Slide

  6. The Kotlin Journey

    View Slide

  7. How do I start?
    Am I doing

    this right?
    I’m convinced
    I love Kotlin




    View Slide

  8. Taking Full Advantage of Kotlin
    Get Started With Kotlin Idiomatic Kotlin
    Going Full Kotlin Kotlin Beyond Android

    View Slide

  9. Taking Full Advantage of Kotlin
    Idiomatic Kotlin
    Going Full Kotlin Kotlin Beyond Android
    New Projects

    Converting Java

    Experimentation

    View Slide

  10. Taking Full Advantage of Kotlin
    Going Full Kotlin Kotlin Beyond Android
    New Projects

    Converting Java

    Experimentation
    Syntax

    Kotlin Standard Library

    Language Features

    View Slide

  11. Taking Full Advantage of Kotlin
    Kotlin Beyond Android
    New Projects

    Converting Java

    Experimentation
    Syntax

    Kotlin Standard Library

    Language Features
    Android Jetpack

    Coroutines/Flow

    Buildscripts/Libraries

    View Slide

  12. Taking Full Advantage of Kotlin
    New Projects

    Converting Java

    Experimentation
    Syntax

    Kotlin Standard Library

    Language Features
    Android Jetpack

    Coroutines/Flow

    Buildscripts/Libraries
    Kotlin Multiplatform

    Server-side Kotlin

    Kotlin Scripting

    View Slide

  13. Taking Advantage of Kotlin

    for Android Development

    View Slide

  14. Getting Started

    With Kotlin

    How do I start?

    View Slide

  15. Create A New Android
    Studio Project

    View Slide

  16. View Slide

  17. Convert Existing Java

    to Kotlin

    View Slide

  18. Paste Java Into a

    Kotlin File

    View Slide

  19. Quickly Evaluate

    Kotlin Code

    View Slide

  20. Quickly Evaluate Kotlin Code
    •Kotlin scratch files

    •Kotlin REPL

    •Add a main() function

    View Slide

  21. Idiomatic Kotlin

    Am I doing this right?

    View Slide

  22. Useful Syntax

    View Slide

  23. Useful Syntax
    •Use non-null types

    •Avoid #!!

    •Use lateinit var

    •Utility functions without classes

    View Slide

  24. Kotlin Standard Library

    View Slide

  25. • arrayOf() / listOf() / mapOf()

    • filter()

    • map()

    • orEmpty()

    • getOrElse()

    • isNullOrEmpty() / isNullOrBlank()
    Kotlin Standard Library

    View Slide

  26. val awesomeThings = listOf("360AnDev", null, "Kotlin")

    View Slide

  27. val awesomeThings = listOf("360AnDev", null, "Kotlin")

    .filterNotNull()

    View Slide

  28. val awesomeThings = listOf("360AnDev", null, "Kotlin")

    .filterNotNull()

    .filter { it.length > 6 }

    View Slide

  29. val awesomeThing = listOf("360AnDev", null, "Kotlin")

    .filterNotNull()

    .filter { it.length > 6 }

    .getOrElse(0) {

    "There were no awesome things longer than 6 chars"

    }

    View Slide

  30. val awesomeThing = listOf("360AnDev", null, "Kotlin")

    .filterNotNull()

    .filter { it.length > 6 }

    .getOrElse(0) {

    "There were no awesome things longer than 6 chars"

    }

    .let { AwesomeThing(it) }

    View Slide

  31. Special Language

    Features

    View Slide

  32. • Data classes

    • Sealed classes

    • Extension functions
    Special Language Features

    View Slide

  33. data class Repo(

    val name: String,

    val owner: Owner,

    val stars: Int

    )

    Data Classes

    View Slide

  34. sealed class ViewState {

    object Loading : ViewState()

    data class Error(val error: Throwable?)

    data class Success(val data: List)

    }

    Sealed Classes

    View Slide

  35. fun Context.longToast(msg: String) {

    Toast.makeText(this, msg, Toast.LENGTH_LONG).show()

    }

    Extension Functions

    View Slide

  36. Going Full Kotlin

    Kotlin all the things!

    View Slide

  37. Android Jetpack

    View Slide

  38. Android Jetpack
    •Paging 3

    •Benchmark

    •Android KTX

    View Slide

  39. Android KTX

    View Slide

  40. Kotlin extensions for Jetpack

    Leverage Kotlin features

    •Extension functions/properties

    •Lambdas

    •Coroutines
    Android KTX

    View Slide

  41. sharedPreferences.edit {

    putString(“key”, “with KTX”)

    putBoolean(“lessBoilerplat”, true)

    }

    KTX Core

    View Slide

  42. fragmentManager().commit {

    addToBackstack(“#..”)

    add(…)

    }

    Fragment KTX

    View Slide

  43. val viewState: LiveData = liveData {

    emit(defaultViewState())

    }

    LiveDate KTX

    View Slide

  44. @Query(“SELECT * FROM Repos”)

    suspend fun getRepos(): List

    @Query(“SELECT * FROM Repos”)

    Fun getRepos(): Flow>

    Room KTX

    View Slide

  45. Class RepoListViewModel : ViewModel() {

    init {

    viewModelScope.launch {

    #// load async data

    }

    }

    }

    ViewModel KTX

    View Slide

  46. Kotlin Coroutines

    View Slide

  47. Coroutines are the
    recommended solution for
    async programming on
    Android

    View Slide

  48. @UiThread

    suspend fun showTasks() {

    val tasks = loadTasksFromDisk()

    displayTasks(tasks)

    }



    suspend fun loadTasksFromDisk: List

    View Slide

  49. Class TaskListViewModel : ViewModel() {

    init {

    viewModelScope.launch {

    showTasks()

    }

    }

    }

    View Slide

  50. interface TasksApi {

    @GET(“/tasks/user”)

    suspend fun loadTasksForUser(id: String)

    }

    View Slide

  51. Class TaskListViewModel : ViewModel() {

    init {

    viewModelScope.launch {

    showTasks()

    val networkTasks = loadTasksForUser()

    }

    }

    }

    View Slide

  52. Kotlin Flow

    View Slide

  53. A Flow is an async data
    stream leveraging
    coroutines

    View Slide

  54. @Query(“SELECT * FROM Repos”)

    fun getRepos(): Flow>

    View Slide

  55. val repos: LiveData>

    = repoDao.getRepos().asLiveData()

    View Slide

  56. class TaskListViewModel : ViewModel() {

    private val _viewState = MutableStateFlow(ViewState())

    val viewState: StateFlow = _viewState

    }

    View Slide

  57. Gradle Kotlin DSL

    View Slide

  58. import org.jetbrains.kotlin.config.KotlinCompilerVersion

    plugins {

    id(“com.android.application”)

    kotlin(“android”)

    kotlin(“android.extensions”)

    }

    android {

    compileSdkVersion(29)



    }

    dependencies {

    iplementation(“com.android.support:appcompat-v7:27.1.1”)

    }
    build.gradle.kts

    View Slide

  59. Jetpack Compose

    View Slide

  60. Jetpack Compose is the
    future of UI development
    for Android

    View Slide

  61. @Composable

    fun HelloWorld() {

    Test(“Hello World”)

    }

    View Slide

  62. @Composable

    fun RepoItem() {

    Column {

    Text(“repo name”)

    Text(“repo owner”)

    }

    }

    View Slide

  63. class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

    super.onCreate(savedInstanceState)

    setContent {

    RepoItem()

    }

    }

    }

    View Slide

  64. Bonus
    • Koin

    • SQLDelight

    • Moshi

    • Coil

    • MockK

    View Slide

  65. Kotlin Beyond Android

    What else can I build with Kotlin?

    View Slide

  66. Kotlin Multiplatform

    View Slide

  67. Share core logic
    across platforms using
    Kotlin Multiplatform

    View Slide

  68. Kotlin Multiplatform
    Write common Kotlin code

    Package/Consume for multiple targets

    •Android/JVM

    •iOS/MacOS

    •JavaScript

    •Native

    View Slide

  69. Kotlin Multiplatform
    Does not replace native UI

    Relatively low risk for Android

    View Slide

  70. Server Side Kotlin

    View Slide

  71. Server

    Side

    Kotlin
    Multiple supported frameworks

    •Ktor

    •Spring Boot

    •Quarkus

    View Slide

  72. fun main(args: Array) {

    val server = embeddedServer(Netty, 8080) {

    routing {

    get(“/“) {

    call.respondText(“Hello World!”, ContentType.Text.HTML)

    }

    get(“/tasks”) {

    #// return tasks

    }

    }

    }

    server.start(wait = true)

    }
    Simple Ktor service

    View Slide

  73. More Kotlin

    View Slide

  74. More Kotlin
    Additional ways to use Kotlin

    •JavaScript

    •Kotlin Native

    •Kotlin scripting using script

    View Slide

  75. Kotlin
    First

    View Slide

  76. Taking Full Advantage of Kotlin
    Project

    Samples &

    Defaults
    Libraries &

    Tooling
    Recommended

    Language &

    Patterns
    Usefulness

    Beyond

    Android

    View Slide

  77. How do I start?
    Am I doing

    this right?
    I’m convinced
    I love Kotlin




    View Slide

  78. ANDROID DEVELOPER
    @n8ebel www.goobar.io
    Nate Ebel
    Thanks for Watching

    View Slide