Kotlin 2.0.0 Android项目中显式幕后字段无法使用问题
Kotlin 2.0.0中显式backing field声明报错的解决方法
场景与代码
在Android项目中使用Kotlin 2.0.0版本,编写如下代码:
class MainActivity : ComponentActivity() { val state: StateFlow<Int> field = MutableStateFlow(0) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidTheme { SignInScreenRoute() } } } }
错误提示
运行后出现如下编译错误:
Explicit backing field declarations are not supported in FE 1.0
项目配置
libs.versions.toml
[versions] androidGradlePlugin = "8.4.1" kotlin = "2.0.0" coreKtx = "1.13.1" junit = "4.13.2" junitVersion = "1.1.5" espressoCore = "3.5.1" lifecycleRuntimeKtx = "2.8.0" activityCompose = "1.9.0" composeBom = "2024.05.00" navigationCompose = "2.7.7" koinAndroid = "3.5.6" koinAndroidxCompose = "3.5.6" ktor = "2.3.10" appcompat = "1.6.1" material = "1.12.0" serialization = "1.6.3" googleFont = "1.6.7" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-foundation-layout = { group = "androidx.compose.foundation", name = "foundation-layout" } androidx-runtime = { group = "androidx.compose.runtime", name = "runtime" } androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose" } androidx-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-material_icons = { group = "androidx.compose.material", name = "material-icons-extended" } koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koinAndroid" } koin-androidx-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koinAndroidxCompose" } ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" } ktor-client-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktor" } ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" } ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" } ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "serialization" } google-font= { group = "androidx.compose.ui", name = "ui-text-google-fonts", version.ref = "googleFont" } [plugins] androidApplication = { id = "com.android.application", version.ref = "androidGradlePlugin" } jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } androidLibrary = { id = "com.android.library", version.ref = "androidGradlePlugin" } serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
app模块build.gradle.kts
plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsKotlinAndroid) alias(libs.plugins.compose.compiler) } android { namespace = "com.hub.abc" compileSdk = 34 defaultConfig { applicationId = "com.hub.abc" minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { implementation(project(":network")) implementation(project(":core:coroutines")) implementation(project(":core:ui")) implementation(project(":feature:signup:ui")) implementation(project(":feature:signup:data")) implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) implementation(libs.androidx.ui) implementation(libs.androidx.foundation) implementation(libs.androidx.foundation.layout) implementation(libs.androidx.runtime) implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.navigation) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(libs.koin.android) implementation(libs.koin.androidx.compose) implementation(libs.serialization.json) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) }
解决方案
错误原因是Kotlin 2.0.0中显式声明backing field(field = ...)的语法不再被FE 1.0前端支持。正确的写法有两种:
方式一:封装可变实现,暴露只读接口
这是最符合封装规范的写法,适合需要后续修改状态的场景:
class MainActivity : ComponentActivity() { private val _state = MutableStateFlow(0) val state: StateFlow<Int> = _state override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidTheme { SignInScreenRoute() } } } }
方式二:直接赋值(无需后续修改时使用)
如果不需要在类内部修改state的值,可以直接声明为只读属性并指定类型:
class MainActivity : ComponentActivity() { val state: StateFlow<Int> = MutableStateFlow(0) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidTheme { SignInScreenRoute() } } } }
两种写法都能解决编译报错问题,可根据实际业务场景选择。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

