首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迁移到新的kotlin-parcelize

迁移到新的kotlin-parcelize
EN

Stack Overflow用户
提问于 2020-11-24 16:50:41
回答 6查看 10.9K关注 0票数 38

有谁能解释一下如何迁移到新的 kotlin-parcelize

我试过:

  1. 在app apply plugin: 'kotlin-android-extensions'中将apply plugin: 'kotlin-parcelize'替换为apply plugin: 'kotlin-parcelize'
  2. import kotlinx.android.parcel.Parcelize替换为import kotlinx.parcelize.Parcelize

后一种导致

代码语言:javascript
运行
复制
Class 'ParcelZonedDateTime' is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in android.os.Parcelable

例如,这一守则:

代码语言:javascript
运行
复制
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中的错误(不是抽象的,也没有实现抽象成员公共抽象describeContents())可以也必须被忽略。然而,我在使用泛型时遇到了一个问题:

代码语言:javascript
运行
复制
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

sealed class MyDialogEvent {
    @Parcelize
    data class Confirmed<T: Parcelable>(val identity: String, val data: T) : Parcelable
}

为此生成的代码是

代码语言:javascript
运行
复制
@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;
    }
}

在编译过程中,我得到了这个错误(行号与示例代码不匹配,但是您可以通过比较方法名来轻松地识别匹配的行):

代码语言:javascript
运行
复制
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()
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-12-16 09:47:36

这是kapt中的一个bug,据报道是这里。实际上,您发布的java代码是一个存根类,它由kapt生成,用于在其上运行注释处理器(如您所见,没有真正的实现,只有结构和注释)。因此,作为一种解决办法,您可以将带有@Parcelize注释的代码移动到没有启用kapt的单独模块中。kotlin-parcelize本身不使用注释处理器来生成代码,它使用编译器插件直接发出IR,我相信。

更新:问题已在kotlin 1.5中修复

票数 22
EN

Stack Overflow用户

发布于 2021-11-03 16:26:13

这是我的工作,请仔细检查行的顺序。

代码语言:javascript
运行
复制
plugins {
    id 'kotlin-android'
    id 'kotlin-parcelize'
    id 'kotlin-kapt'    
   }
票数 3
EN

Stack Overflow用户

发布于 2020-12-15 10:18:56

经过进一步的检查,我认为带有包构造的Parcelable泛型类型无法编译,因为不能从这个T class中泛化地确定T class

也许最后的办法是进行一次绞刑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64991110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档