gpt4 book ai didi

android - 迁移到新的 kotlin-parcelize

转载 作者:行者123 更新时间:2023-12-03 07:36:03 27 4
gpt4 key购买 nike

谁能解释一下如何迁移到 new kotlin-parcelize ?
我试过了:

  • 替换 apply plugin: 'kotlin-android-extensions'apply plugin: 'kotlin-parcelize'在应用程序 build.gradle
  • 替换 import kotlinx.android.parcel.Parcelizeimport 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 ?
    更新:
    根据评论:是的,我使用的是 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()

    最佳答案

    这是 kapt 中的一个错误,据报道 here .实际上,您发布的 java 代码是一个由 kapt 生成的 stub 类,用于在其上运行注释处理器(如您所见,没有真正的实现,只有结构和注释)。因此,作为一种解决方法,您可以使用 @Parcelize 移动代码注释到您没有启用 kapt 的单独模块。 kotlin-parcelize我相信它本身不使用注释处理器来生成代码,它使用编译器插件直接发出 IR。
    更新:问题已在 kotlin 1.5 中得到修复

    关于android - 迁移到新的 kotlin-parcelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64991110/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com