Kotlin 搭配 Parcelable + Parcelize 使用

如果没了解 Parcelable 建议自行了解再回来看该篇文章

直接进入主题,我们都知道,Kotlin有自己的空检测机制,那么对于一些实体类我们有个默认的构造函数,如下:

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

逻辑上已经确保了该实体的参数是不会为null的,所以当调用这些参数时是不需要使用 !! ?! 等等
但是,如果需要实现 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就抛出异常,但是我们知道构造函数已经杜绝了null,所以肯定不会返回null的,所以使用!!

使用Parcelize简洁代码

  1. 升级Kotlin Gradle plugins和Android Studio plugin到1.3.60以上
  2. 在项目里面的build.gradle内添加如下:
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了,这个注解在后面都生成了相关代码

如果需要更高级的序列化逻辑

那么就需要在伴生类中重写了,代码直接如下:

/**
 * 专辑
 * @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)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容