我对Kotlin和Compose多平台非常陌生,但我想知道是否有一种方法可以在iOS和Android之间创建特定于平台的Views
.
我已经设法为Android制作了一个特定于平台的按钮,但iOS的按钮是不可见的.该应用程序可以在两个平台上运行,并且没有错误.
commonMain
中App.kt
中的使用情况:
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun App() {
var counter by remember { mutableStateOf(0) }
MaterialTheme {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.fillMaxSize()
) {
Column(
verticalArrangement = Arrangement.spacedBy(16.dp),
) {
Text("Counter: $counter")
PlatformButton.createButton("Click to increase Counter") {
counter++
}
}
}
}
}
我对commonMain
年的期望值:
import androidx.compose.runtime.Composable
expect class PlatformButton {
companion object {
@Composable
fun createButton(label: String, onClick: () -> Unit): Any
}
}
我androidMain
岁时的实际班级:
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
actual class PlatformButton {
actual companion object {
@Composable
actual fun createButton(label: String, onClick: () -> Unit): Any {
return Button(onClick) {
Text(label)
}
}
}
}
我iosMain
岁时的实际班级:
import androidx.compose.runtime.Composable
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.ObjCAction
import platform.UIKit.UIButton
import platform.UIKit.UIButtonTypeSystem
import platform.UIKit.UIControlEventTouchUpInside
import platform.darwin.NSObject
import platform.darwin.sel_registerName
actual class PlatformButton {
actual companion object {
@OptIn(ExperimentalForeignApi::class)
@Composable
actual fun createButton(label: String, onClick: () -> Unit): Any {
val uiButton = UIButton.buttonWithType(UIButtonTypeSystem)
uiButton.setTitle(label, forState = 0u)
val block = object : NSObject() {
@ObjCAction
fun buttonClicked() {
onClick()
}
}
uiButton.addTarget(block, action = sel_registerName("buttonClicked"), forControlEvents = UIControlEventTouchUpInside)
return uiButton
}
}
}
我已经搜索了文件,但没有找到任何文件.我也不太喜欢在Kotlin
中使用UIKit
.难道没有其他方法可以使用SwiftUI
代码,并以某种方式用桥从它创建Composable
View
吗?我还想知道的是:这样的用例有没有特定的返回类型,而不是Any
?