Kotlin 搭配 Parcelable + Parcelize 使用

如果沒了解 Parcelable 建議自行了解再回來看該篇文章

直接進入主題,我們都知道,Kotlin有自己的空檢測機制,那么對于一些實體類我們有個默認的構(gòu)造函數(shù),如下:

class Album internal constructor(
    var id: String,
    var coverUri: Uri,
    var displayName: String,
    var count: Long
)

邏輯上已經(jīng)確保了該實體的參數(shù)是不會為null的,所以當調(diào)用這些參數(shù)時是不需要使用 !! ?! 等等
但是,如果需要實現(xiàn) Parcelable,就會空警告,如下:

class Album internal constructor(
    val id: String,
    var coverUri: Uri,
    var displayName: String,
    var count: Long
) : Parcelable {

    constructor(parcel: Parcel) :
            this(parcel.readString()!!,
                parcel.readParcelable(Uri::class.java.classLoader)!!,
                parcel.readString()!!,
                parcel.readLong())

}

大家可以看到,用!!方式解決,如果返回null就拋出異常,但是我們知道構(gòu)造函數(shù)已經(jīng)杜絕了null,所以肯定不會返回null的,所以使用!!

使用Parcelize簡潔代碼

  1. 升級Kotlin Gradle plugins和Android Studio plugin到1.3.60以上
  2. 在項目里面的build.gradle內(nèi)添加如下:
plugins {
    id 'com.android.library'
    id 'kotlin-android'
    // 插件提供的其他特性,@Parcelize、View binding and caching
    id 'kotlin-android-extensions'
}
  1. 或者只需要 @Parcelize特性,如下:
plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'kotlin-parcelize'
}
  1. 然后直接加入@Parcelize注解即可,如下:
@Parcelize
class Album internal constructor(
    val id: String,
    var coverUri: Uri,
    var displayName: String,
    var count: Long
) : Parcelable {}

非常簡潔的代碼不用管createwrite了,這個注解在后面都生成了相關(guān)代碼

如果需要更高級的序列化邏輯

那么就需要在伴生類中重寫了,代碼直接如下:

/**
 * 專輯
 * @author zhihu
 */
@Parcelize
class Album internal constructor(
    val id: String,
    var coverUri: Uri,
    var displayName: String,
    var count: Long
) : Parcelable {

    constructor(parcel: Parcel) :
            this(parcel.readString()!!,
                parcel.readParcelable(Uri::class.java.classLoader)!!,
                parcel.readString()!!,
                parcel.readLong())

    companion object : Parceler<Album> {

        override fun create(parcel: Parcel): Album {
            return Album(parcel)
        }

        override fun Album.write(parcel: Parcel, flags: Int) {
            parcel.writeString(id)
            parcel.writeParcelable(coverUri, 0)
            parcel.writeString(displayName)
            parcel.writeLong(count)
        }
    }
}

歡迎star

一個非常豐富的開源庫,如果你需要相冊、錄制、錄音等操作,那么這個也許對你有一定的幫助:
zhongjhATC/AlbumCameraRecorder: ??一個高效的多媒體支持操作庫,可多方面的簡單配置操作相冊、拍照、錄制、錄音等功能。也支持配套使用的展示圖片、視頻、音頻的九宮格功能。 (An efficient multimedia support operation library, can be a variety of simple configuration operation album, photo, recording, recording and other functions.Also support supporting the use of the display of pictures, video, audio of the nine grid function.) (github.com)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容