Android Studio中使用Kotlin简化Bundle指定键存在校验的方法咨询
Kotlin 优雅读取Bundle参数的实现方案
基础优化:移除冗余逻辑
你现有代码中的containsKey判断属于完全冗余的逻辑:当Bundle中不存在对应Key、Key对应值为null、或值类型不匹配时,getParcelable都会直接返回null,后续的let代码块自然不会执行。仅做基础优化后代码量可减少50%:
bundle.getParcelable<Product>(Extras.PRODUCT)?.let { mpresenter.mProduct = it } bundle.getParcelable<Animal>(Extras.ANIMAL)?.let { mpresenter.mAnimal = it }
现代化实现:扩展函数+批量处理
针对需要读取十余个甚至更多参数的场景,可以通过Kotlin扩展函数封装模板逻辑,再通过映射列表批量处理,彻底消灭重复代码。
第一步:封装多版本兼容的Parcelable读取扩展
针对Android 13及以上版本对getParcelable方法的变更,先做向下兼容的封装:
import android.os.Build import android.os.Bundle import android.os.Parcelable inline fun <reified T : Parcelable> Bundle.getParcelableCompat(key: String): T? = when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getParcelable(key, T::class.java) else -> @Suppress("DEPRECATION") getParcelable(key) as? T }
第二步:批量映射赋值
把所有Key和对应的赋值逻辑整理成映射列表,统一遍历处理,后续新增参数只需新增一行映射即可:
listOf( Extras.PRODUCT to { it: Product -> mpresenter.mProduct = it }, Extras.ANIMAL to { it: Animal -> mpresenter.mAnimal = it }, // 新增参数直接在此处追加映射关系即可 Extras.USER to { it: User -> mpresenter.mUser = it }, Extras.SHOP to { it: Shop -> mpresenter.mShop = it } ).forEach { (key, setter) -> bundle.getParcelableCompat<Parcelable>(key)?.let { value -> setter(value as Nothing) } }
特殊场景适配
如果你需要明确区分「Key不存在」和「Key存在但值为null」两种场景,才需要保留containsKey判断,可封装对应扩展:
inline fun <reified T : Parcelable> Bundle.getParcelableIfKeyExists(key: String): T? { return if (containsKey(key)) getParcelableCompat(key) else null }
后续读取时直接调用该扩展即可,无需重复写判断逻辑。
内容的提问来源于stack exchange,提问作者Gideon Tobing
相关产品推荐
相关产品推荐

