首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin android parcelable

Kotlin android parcelable
EN

Stack Overflow用户
提问于 2016-05-22 09:07:05
回答 3查看 8.5K关注 0票数 9

我已经为android使用了自动生成的android插件功能,它为我生成了以下代码,但是我不明白为什么final val需要CREATOR字段?我第一次在kotlin中看到final关键字。

代码语言:javascript
运行
复制
data class Person(
        val name: String,
        val surname: String
) : Parcelable {
    constructor(source: Parcel): this(source.readString(), source.readString())

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeString(name)
        dest?.writeString(surname)
    }

    companion object {
        @JvmField final val CREATOR: Parcelable.Creator<Person> = object : Parcelable.Creator<Person> {
            override fun createFromParcel(source: Parcel): Person {
                return Person(source)
            }

            override fun newArray(size: Int): Array<Person?> {
                return arrayOfNulls(size)
            }
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-22 09:31:15

在Kotlin 类和成员在默认情况下是最终的。。换句话说,以下声明具有相同的字节码:

代码语言:javascript
运行
复制
@JvmField final val CREATOR: Parcelable.Creator<Person> = PersonCreator()
@JvmField val CREATOR: Parcelable.Creator<Person> = PersonCreator()

因此,虽然生成的代码有final关键字,而且它不是错误,但它是多余的。

尽管类和成员在默认情况下是最终的,但在Kotlin中仍然需要final修饰符。例如,在派生类中将open方法标记为final

代码语言:javascript
运行
复制
open class Base {
    open fun test(){}
}

open class DerivedA : Base(){
    final override fun test(){}
}

class DerivedB : DerivedA() {
    override fun test(){} //error: 'test' in 'DerivedA' is final and cannot be overriden
}

虽然在java中创建public static字段final是一个很好的实践,但是字段将被标记为这样:

实现Parcelable接口的类还必须具有一个非空静态字段,称为实现Parcelable.Creator接口的类型的创建者。

票数 8
EN

Stack Overflow用户

发布于 2019-05-03 12:21:29

在Kotlin中,您可以使用@Parcelize Kotlin Android扩展:

代码语言:javascript
运行
复制
@Parcelize
data class User(val id: String, val name: String) : Parcelable

这是一个编译器插件,自动为您生成Parcelable实现。

Kotlin文档上的此页提供了更多关于它的详细信息,包括需求、支撑类型以及如何为不受支持的类型创建定制包

如果您很好奇,并且想深入了解实现的技术细节,请参阅Kotlin演化和增强过程。

这个特性是实验直到Kotlin 1.3.40。如果您仍在使用1.3.40之前的Kotlin版本,则需要启用以下实验特性:

代码语言:javascript
运行
复制
android {
    // Enable @Parcelize
    // You only need this for Kotlin < 1.3.40
    androidExtensions {
        experimental = true
    }
    ...
}
票数 7
EN

Stack Overflow用户

发布于 2020-03-11 10:42:33

对数据类使用@Parcelize注释并扩展Parcelable。科特林会自动替你做剩下的事。个人数据类。

代码语言:javascript
运行
复制
@Parcelize
data class Person(val name: String, val age: Int, val email: String) : Parcelable

您可以发送值,让按下按钮点击下面的活动。

代码语言:javascript
运行
复制
   private val PERSON = "person"

   // first ensure a person object with data
   val person = Person("Shihab Uddin", 30, "shihab.mi7@gmai.com")

   binding.buttonSend.setOnClickListener {

        val intent = Intent(this, ReceiveParcelableAcitivty::class.java)
        //then put an parcelable extra to intent 
        intent.putExtra(PERSON, person)
        startActivity(intent)

    }

接收者活动将获得如下的数据

代码语言:javascript
运行
复制
    private val PERSON = "person"
    intent?.let {
        var person = intent.extras.getParcelable(PERSON) as Person
        bind.textViewData.text = " Data Receive: $person"
    }

androidExtensions属性不再是必需的< kotlin 1.3.40

代码语言:javascript
运行
复制
android {

    // You only need this for Kotlin < 1.3.40
    androidExtensions {
        experimental = true
    }
    ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37372435

复制
相关文章

相似问题

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