我正在学习Jetpack写作,在学习的同时,我遇到了一些我不知道如何解决的问题。下面是我的开发环境、代码和编译结果。
环境:
代码:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
DemoTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting()
}
}
}
}
}@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Greeting(
viewModel: GreetingViewModel = remember {
GreetingViewModel()
}
) {
val uiState = viewModel.uiState.collectAsState().value
Column(
modifier = Modifier
.fillMaxWidth()
.padding(32.dp)
) {
TextField(value = uiState.name, onValueChange = {
viewModel.handleAction(
GreetingViewModel.UiAction.NameChanged(it)
)
})
Text(text = "Hello ${uiState.name}!")
}
}class GreetingViewModel {
data class UiState(val name: String)
private val _uiState = MutableStateFlow(UiState(name = ""))
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
sealed class UiAction {
class NameChanged(val name: String) : UiAction()
}
fun handleAction(action: UiAction) {
when (action) {
is UiAction.NameChanged -> {
_uiState.value = uiState.value.copy(
name = action.name
)
}
}
}
}结果:
GreetingViewModel$UiAcion.class: Decompiled.class file, bytecode version:61.0(Java 17)
Waring: One or more classes has class file version >= 56 which is not officially supported.
Error: com.android.tools.r8.internal.nc: Sealed classes are not supported as program classes发布于 2022-08-24 06:43:14
D8和R8编译器(生成Sealed classes are not supported as program classes错误的编译器)中不完全支持密封类。在https://issuetracker.google.com/227160052中跟踪完全支持密封类。D8支持将出现在,目前正在预览中,而R8支持要到更高版本才会出现。
发布于 2022-10-20 16:56:22
这是由于使用JDK 17构建,而不是告诉它让Android兼容(即。( Java 11)。在为Android构建Java / Kotlin类时,需要生成兼容Java 11的字节码。您仍然可以使用JDK 17进行构建,但您需要告诉它将其拨回一点,而不是使用dexer无法处理的新内容。
您可以在构建文件中这样做(假设这里的tasks.withType构建文件,groovy文件的tasks.withType语法略有不同):
// Pure Kotlin
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
jvmTarget = JavaVersion.VERSION_11.toString()
}
// Pure Java
tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_11.toString()
targetCompatibility = JavaVersion.VERSION_11.toString()
}
// Android
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}更多解释:
正如输出所述,类文件有一个字节码版本61 (对应于Java 17 ),并且不支持具有版本>= 56 (Java 12)的类文件,换句话说,不支持Java 11上的任何内容。
在本例中,它所讨论的密封类很可能是Java 17中引入的Java类,而不是Kotlin类,如果针对Java 11的话,Kotlin类将被编译为与Java 11兼容的字节代码。
发布于 2022-08-23 05:38:44
在Kotlin 1.0中,密封的功能是相当有限的。例如,所有子类都必须嵌套,子类不能成为数据类(本章后面将讨论数据类)。Kotlin 1.1放宽了这些限制,并允许您在同一文件中的任何位置定义密封类的子类。在给定的示例中,直到现在才允许使用。在以后的版本中,他们可能会放宽这一限制。但是,您可以这样做:
class SomeActivity {
sealed class Expr {
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
}https://stackoverflow.com/questions/73453524
复制相似问题