Android kotlin 委托获取 intent 参数

通过 Kotlin 中的两个接口:ReadOnlyProperty 和 ReadWriteProperty,可以方便的实现属性委托或局部委托。对于 val 变量使用 ReadOnlyProperty,而 var 变量实现ReadWriteProperty。



这里通过 kotlin 实现委托获取界面跳转时 intent 传递的数据:

fun <T> extraActivity(name: String): ActivityExtras<T?> = ActivityExtras(name, null)

fun <T> extraActivity(name: String, defaultValue: T) = ActivityExtras(name, defaultValue)

fun <T> extraFragment(name: String): FragmentExtras<T?> = FragmentExtras(name, null)

fun <T> extraFragment(name: String, defaultValue: T) = FragmentExtras(name, defaultValue)


class ActivityExtras<T>(private val name: String, private val defaultValue: T) :
    ReadOnlyProperty<Activity, T> {

    private var extra: T? = null

    override fun getValue(thisRef: Activity, property: KProperty<*>): T {
        return extra
            ?: thisRef.intent?.extras?.take<T>(name)?.also { extra = it }
            ?: defaultValue.also { extra = it }
    }
}


class FragmentExtras<T>(private val name: String, private val defaultValue: T) :
    ReadOnlyProperty<Fragment, T> {

    private var extra: T? = null

    override fun getValue(thisRef: Fragment, property: KProperty<*>): T {
        return extra
            ?: thisRef.arguments?.take<T>(name)?.also { extra = it }
            ?: defaultValue.also { extra = it }
    }
}


@Suppress("UNCHECKED_CAST")
fun <T> Bundle.take(key: String): T? {
    try {
        return get(key) as? T?
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return null
}

使用姿势:

// 跳转至 activity
val intent = Intent(context, xxx::class.java)
intent.putExtra("name", "candy")
context.startActivity(intent)

// activity 中获取参数
private val mName by extraActivity<String>("name")



// fragment 传递参数
val fragment = XxxFragment()
fragment.arguments = Bundle().apply { putString("name", name) }

// fragment 中获取参数
private val mName by extraFragment<String>("name")

就这么简单。

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

相关阅读更多精彩内容

友情链接更多精彩内容