更新用户界面
构建用户界面时,你将在项目的Android部分使用Compose Multiplatform工具包,而在iOS部分使用SwiftUI 。两者都是声明式UI框架,你会在UI实现中看到相似之处。在这两种情况下,数据都存储在phrases
变量中,随后通过遍历来生成一系列Text
项。
更新Android部分
composeApp
模块包含一个Android应用,定义了其主活动和UI视图,并将shared
模块作为常规Android库使用。应用的UI使用了Compose Multiplatform框架。
进行一些更改并观察它们如何反映在UI中:
导航到
composeApp/src/androidMain/kotlin
中的App.kt
文件。找到
Greeting
类的调用。选中greet()
函数,右键点击并选择转到 | 声明或用法菜单项。你会看到这是你在上一步中编辑的shared
模块中的同一个类。在
Greeting.kt
中,更新greet()
函数:fun greet(): List<String> = buildList { add(if (Random.nextBoolean()) "Hi!" else "Hello!") add("Guess what this is! > ${platform.name.reversed()}!") }现在它返回一个字符串列表。
返回
App.kt
文件并更新App()
的实现:@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() } } } }这里的
Column
可组合项展示了每个Text
项,并在它们周围添加了内边距和间距。按照Android Studio的建议导入缺失的依赖项。
现在你可以运行Android应用,看看它如何显示字符串列表:
在Xcode中处理iOS模块
iosApp
是一个Xcode项目,构建为iOS应用。它依赖并使用shared
模块作为iOS框架。应用的UI是用Swift编写的。
实现与Android应用中相同的更改:
在项目工具窗口中找到项目根目录下的
iosApp
文件夹。在
iosApp
中,右键点击iosApp.xcodeproj
文件夹并选择打开方式 | Xcode。打开
ContentView.swift
文件,选中greet()
函数并使用⌃ ⌘ J快捷键,或右键点击函数名并选择跳转到定义。你会看到
shared
模块中定义的Kotlin函数的Objective-C声明。Kotlin类型在从Objective-C/Swift使用时表示为Objective-C类型。这里的greet()
函数在Kotlin中返回List<String>
,在Swift中视为返回NSArray<NSString>
。有关类型映射的更多信息,请参阅与Swift/Objective-C的互操作性。更新SwiftUI代码,以与Android应用相同的方式显示列表项:
struct ContentView: View { let phrases = Greeting().greet() var body: some View { List(phrases, id: \.self) { Text($0) } } }greet()
调用的结果存储在phrases
变量中(Swift中的let
类似于Kotlin的val
)。List
函数生成一系列Text
项。如果你尚未重新构建iOS框架,Xcode会在此
ContentView
实现中报告错误。这是预期的——继续下一步。
在Android Studio中,启动iOS运行配置以查看更改:
可能的问题及解决方案
Xcode在调用共享框架的代码中报告错误
你的Xcode项目可能仍在使用旧版本的框架。要解决此问题,请返回Android Studio并重新构建项目或启动iOS运行配置。
Xcode在导入共享框架时报告错误
Xcode可能需要清除缓存的二进制文件:尝试通过在主菜单中选择产品 | 清理构建文件夹来重置环境。
下一步
在教程的下一部分,你将了解依赖项,并添加第三方库以扩展项目的功能。
获取帮助
Kotlin Slack 。获取邀请并加入#multiplatform频道。
Kotlin问题跟踪器。 报告新问题。