【发布时间】:2020-11-24 16:50:41
【问题描述】:
谁能解释一下如何迁移到newkotlin-parcelize?
我试过了:
- 在 app build.gradle 中将
apply plugin: 'kotlin-android-extensions'替换为apply plugin: 'kotlin-parcelize' - 将
import kotlinx.android.parcel.Parcelize替换为import kotlinx.parcelize.Parcelize
后一个导致
Class 'ParcelZonedDateTime' is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in android.os.Parcelable
例如这段代码:
import androidx.annotation.Keep
import kotlinx.parcelize.Parcelize
import org.threeten.bp.ZonedDateTime
@Keep
@Parcelize
data class ParcelZonedDateTime(var value: ZonedDateTime?) :Parcelable {
override fun toString(): String {
return value.toString()
}
}
那么,如何迁移到新的kotlin-parcelize?
更新:
基于 cmets:是的,我使用的是 Kotlin 1.4.20(比 1.4.20-M2 更新)。Kyzer 认为 IDE 中的错误是正确的(不是抽象的,也没有实现抽象成员public abstract fun describeContents()) 可以而且必须被忽略。然而,我在使用泛型时遇到了一个问题:
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
sealed class MyDialogEvent {
@Parcelize
data class Confirmed<T: Parcelable>(val identity: String, val data: T) : Parcelable
}
为此生成的代码是
@kotlin.Metadata(mv = {1, 4, 1}, bv = {1, 0, 3}, k = 3)
public static final class Creator implements android.os.Parcelable.Creator<com.example.stackoverflow.MyDialogEvent.Confirmed> {
public Creator() {
super();
}
@org.jetbrains.annotations.NotNull()
@java.lang.Override()
public final com.example.stackoverflow.MyDialogEvent.Confirmed<T>[] newArray(int size) {
return null;
}
@org.jetbrains.annotations.NotNull()
@java.lang.Override()
public final com.example.stackoverflow.MyDialogEvent.Confirmed<T> createFromParcel(@org.jetbrains.annotations.NotNull()
android.os.Parcel in) {
return null;
}
}
在编译过程中我得到了这个错误(行号与示例代码不匹配,但您可以通过比较方法名称轻松识别匹配的行):
MyDialogEvent.java:167: error: non-static type variable T cannot be referenced from a static context
public final com.example.stackoverflow.MyDialogEvent.Confirmed<T>[] newArray(int size) {
MyDialogEvent.java:173: error: non-static type variable T cannot be referenced from a static context
public final com.example.stackoverflow.MyDialogEvent.Confirmed<T> createFromParcel(@org.jetbrains.annotations.NotNull()
【问题讨论】:
-
抱歉没有这方面的信息,但我肯定泛型不会与注释一起使用,无论包或密封类如何,因为生成类中的静态上下文中的方法确实如此不知道泛型类型 T 是什么
-
看起来 Parcelize 泛型错误是由 Kotlin 1.4.20 本身引入的,而不是插件迁移。如果您回滚到
kotlin-android-extensions并保留 Kotlin 1.4.20,我仍然会遇到同样的错误。 -
我在 kotlin 1.4.21 中遇到了同样的问题,所以我将我的代码回滚到 1.4.10,它工作正常
-
我的项目中也有同样的问题。我尝试了1.4.21版本,但错误仍然存在。有人找到解决方案吗?这真的很烦人。
-
我没有深入研究这个,但现在添加了一个赏金。希望有人对此有答案。或者也许这是一个错误和需要修复? ):
标签: android kotlin parcelable