新版Android Studio中kotlin-parcelize与Safe Args导入异常
问题描述
已将Android Studio更新至最新版本(Narwhal | 2025.1.1 Patch 1)并创建新项目,目前遇到依赖系统配置问题:
- 先后尝试使用
id("kotlin-parcelize")和alias(libs.plugins.kotlin.parcelize)配置插件,且该插件已在libs.versions.toml文件中正确声明,但Model类(Clip类)仍存在@Parcelize相关报错 - Navigation Safe Args无法正常导入
已向Google提交该Bug。
Clip Model类代码
import android.net.Uri import android.os.Parcel import android.os.Parcelable import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey import androidx.room.TypeConverters import com.example.domain.utils.UriConverter import kotlinx.parcelize.Parcelize @Entity(tableName = "clips_table", indices = [Index(value = ["artistId"])]) @TypeConverters(UriConverter::class) @Parcelize data class Clip( @PrimaryKey val id: Long, val name: String, val album: String, val artist: String, val albumId: Long, val artistId: Long, val duration: Long = 0, val contentUri: Uri?, val artUri: Uri?, var customArtUri: String? = null, val year: Int? = null, val dateAdded: Long? = null, val size: Long? = null, val genre: String? = null, val genreId: Long? = null, val trackNumber: Int? = null, var isSelected: Boolean = false, var isFavorite: Boolean = false, var lastPlayed: Long? = null, var playCount: Int = 0, val playlistIds: List<Long> = emptyList() ) : Parcelable { constructor(parcel: Parcel) : this( parcel.readLong(), parcel.readString() ?: "", parcel.readString() ?: "", parcel.readString() ?: "", parcel.readLong(), parcel.readLong(), parcel.readLong(), parcel.readTypedObject(Uri.CREATOR), parcel.readTypedObject(Uri.CREATOR), parcel.readString(), parcel.readInt().takeIf { it != 0 }, parcel.readLong().takeIf { it != 0L }, parcel.readLong().takeIf { it != 0L }, parcel.readString(), parcel.readLong(), parcel.readInt().takeIf { it != Int.MIN_VALUE }, parcel.readInt() == 1, parcel.readInt() == 1, parcel.readLong().takeIf { it != 0L }, parcel.readInt(), parcel.createLongArray()?.toList() ?: emptyList() ) override fun describeContents(): Int = 0 override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeLong(id) dest.writeString(name) dest.writeString(album) dest.writeString(artist) dest.writeLong(albumId) dest.writeLong(artistId) dest.writeLong(duration) dest.writeParcelable(contentUri, flags) dest.writeParcelable(artUri, flags) dest.writeString(customArtUri) dest.writeInt(year ?: 0) dest.writeLong(dateAdded ?: 0L) dest.writeLong(size ?: 0L) dest.writeString(genre) dest.writeLong(genreId ?: 0L) dest.writeInt(trackNumber ?: Int.MIN_VALUE) dest.writeInt(if (isSelected) 1 else 0) dest.writeInt(if (isFavorite) 1 else 0) dest.writeLong(lastPlayed ?: 0L) dest.writeInt(playCount) dest.writeLongArray(playlistIds.toLongArray()) } companion object CREATOR : Parcelable.Creator<Clip> { override fun createFromParcel(parcel: Parcel): Clip { return Clip(parcel) } override fun newArray(size: Int): Array<Clip?> { return arrayOfNulls(size) } } }
项目级Build.Gradle代码
// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.dagger.hilt.plugin) apply false alias(libs.plugins.kotlin.kapt) apply false alias(libs.plugins.ksp) apply false // alias(libs.plugins.navigation.safe.args) apply false alias(libs.plugins.kotlin.parcelize) apply false // id("androidx.navigation.safeargs.kotlin") // id("org.jetbrains.kotlin.plugin.parcelize") version libs.versions.kotlin apply false } buildscript { dependencies { classpath ("androidx.navigation:navigation-safe-args-gradle-plugin:2.8.9") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } }
libs.versions.toml插件配置
[plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } android-library = { id = "com.android.library", version.ref = "agp" } dagger-hilt-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hiltVersion" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kapt-version" } ksp = { id = "com.google.devtools.ksp", version = '2.1.21-2.0.1' } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
应用级build.gradle.kts代码
plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.android.application) alias(libs.plugins.dagger.hilt.plugin) alias(libs.plugins.kotlin.kapt) // alias(libs.plugins.navigation.safe.args) alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.ksp) // id("kotlin-parcelize") } android { namespace = "com.example.mmlaudioplayer" compileSdk = 36 defaultConfig { applicationId = "com.example.mmlaudioplayer" minSdk = 24 targetSdk = 36 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildFeatures { viewBinding = true android.buildFeatures.buildConfig = true buildConfig = true } buildTypes { debug { isDebuggable = true buildConfigField("boolean", "IS_DEBUG_MODE", "true") } release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) buildConfigField("boolean", "IS_DEBUG_MODE", "false") } } hilt { enableAggregatingTask = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } } dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) implementation(libs.material) { exclude(group = "androidx.recyclerview", module = "recyclerview") exclude(group = "androidx.recyclerview", module = "recyclerview-selection") } // تطبيق RecyclerView و Selection بشكل صريح implementation(libs.androidx.recyclerview) // implementation(libs.androidx.recyclerview.selection) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) implementation(libs.coroutines) // implementation(libs.dagger.hilt) // ksp(libs.dagger.hilt.compiler) implementation(libs.dagger.hilt) implementation(libs.androidx.navigation.fragment.ktx) // implementation(libs.androidx.navigation.ui.ktx) ksp(libs.dagger.hilt.compiler) implementation(libs.play.review) implementation(libs.play.review.ktx) implementation(libs.shimmerAnimation) implementation(libs.androidx.viewmodel) implementation(libs.androidx.livedata) implementation(libs.androidx.lifecycle) implementation(libs.androidx.media) implementation(libs.room.runtime) implementation(libs.room.ktx) ksp(libs.room.compiler) implementation(libs.sdp) implementation(libs.ssp) implementation(libs.glide) ksp(libs.glide.compiler) implementation(libs.androidx.palette) implementation(libs.androidx.swiperefreshlayout) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) implementation(project(":domain")) implementation(project(":data")) }
IDE版本信息
Android Studio Narwhal | 2025.1.1 Patch 1 Build #AI-251.25410.109.2511.13752376, built on July 9, 2025 Runtime version: 21.0.6+-13391695-b895.109 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Toolkit: sun.awt.windows.WToolkit Windows 11.0 Kotlin plugin: K2 mode GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation Memory: 4096M Cores: 28 Registry: ide.instant.shutdown=false ide.experimental.ui=true com.android.studio.ml.activeModel=com.android.studio.ml.AidaModel Non-Bundled Plugins: wu.seal.tool.jsontokotlin (3.7.7) com.gionchat.json.bean (1.0.5) com.robohorse.robopojogenerator (2.6.3) com.thoughtworks.gauge (251.25410.129)
内容的提问来源于stack exchange,提问作者Dr Mido
相关产品推荐
相关产品推荐

