Kotlin Multiplatform Development Help

Update the user interface

To build the user interface, you'll use the Compose Multiplatform toolkit for the Android part of your project and SwiftUI for the iOS one. These are both declarative UI frameworks, and you'll see similarities in the UI implementations. In both cases, you store the data in the phrases variable and later iterate over it to produce a list of Text items.

Update the Android part

The composeApp module contains an Android application, defines its main activity and the UI views, and uses the shared module as a regular Android library. The UI of the application uses the Compose Multiplatform framework.

Make some changes and see how they are reflected in the UI:

  1. Navigate to the App.kt file in composeApp/src/androidMain/kotlin.

  2. Find the Greeting class invocation. Select the greet() function, right-click it and select the Go To | Declaration or Usages menu item. You'll see that it's the same class from the shared module you edited in the previous step.

  3. In Greeting.kt, update the greet() function:

    fun greet(): List<String> = buildList { add(if (Random.nextBoolean()) "Hi!" else "Hello!") add("Guess what this is! > ${platform.name.reversed()}!") }

    Now it returns a list of strings.

  4. Go back to the App.kt file and update the App() implementation:

    @Composable @Preview fun App() { MaterialTheme { val greeting = remember { Greeting().greet() } Column( modifier = Modifier.padding(all = 20.dp), verticalArrangement = Arrangement.spacedBy(8.dp), ) { greeting.forEach { greeting -> Text(greeting) Divider() } } } }

    Here the Column composable shows each of the Text items, adding padding around them and space between them.

  5. Follow Android Studio's suggestions to import the missing dependencies.

  6. Now you can run the Android app to see how it displays the list of strings:

    Updated UI of Android multiplatform app

Work with the iOS module in Xcode

iosApp is an Xcode project that builds into an iOS application. It depends on and uses the shared module as an iOS framework. The UI of the app is written in Swift.

Implement the same changes as in the Android app:

  1. Find the iosApp folder at the root of your project in the Project tool window.

  2. Inside iosApp, right-click the iosApp.xcodeproj folder and select Open In | Xcode.

  3. Open the ContentView.swift file, select the greet() function and use the ⌃ ⌘ J shortcut, or right-click the function name and select Jump to Definition.

    You'll see the Objective-C declarations for the Kotlin functions defined in the shared module. Kotlin types are represented as Objective-C types when used from Objective-C/Swift. Here the greet() function returns List<String> in Kotlin and is seen from Swift as returning NSArray<NSString>. For more on type mappings, see Interoperability with Swift/Objective-C.

  4. Update the SwiftUI code to display a list of items in the same way as in the Android app:

    struct ContentView: View { let phrases = Greeting().greet() var body: some View { List(phrases, id: \.self) { Text($0) } } }
    • The results of the greet() call are stored in the phrases variable (let in Swift is similar to Kotlin's val).

    • The List function produces a list of Text items.

    • Xcode reports errors in this ContentView implementation if you haven't rebuilt the iOS framework. This is expected – proceed to the next step.

  5. In Android Studio, start the iOS run configuration to see the changes:

    Updated UI of your iOS multiplatform app

Possible issues and solutions

Xcode reports errors in the code calling the shared framework

Your Xcode project may still be using an old version of the framework. To resolve this, return to Android Studio and rebuild the project or start the iOS run configuration.

Xcode reports an error when importing the shared framework

Xcode may need to clear cached binaries: try resetting the environment by choosing Product | Clean Build Folder in the main menu.

Next step

In the next part of the tutorial, you'll learn about dependencies and add a third-party library to expand the functionality of your project.

Proceed to the next part

Get help

Last modified: 10 September 2024