Android kotlin 委托獲取 intent 參數(shù)

通過 Kotlin 中的兩個接口:ReadOnlyProperty 和 ReadWriteProperty,可以方便的實現(xiàn)屬性委托或局部委托。對于 val 變量使用 ReadOnlyProperty,而 var 變量實現(xiàn)ReadWriteProperty。



這里通過 kotlin 實現(xiàn)委托獲取界面跳轉(zhuǎn)時 intent 傳遞的數(shù)據(jù):

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
}

使用姿勢:

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

// activity 中獲取參數(shù)
private val mName by extraActivity<String>("name")



// fragment 傳遞參數(shù)
val fragment = XxxFragment()
fragment.arguments = Bundle().apply { putString("name", name) }

// fragment 中獲取參數(shù)
private val mName by extraFragment<String>("name")

就這么簡單。

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

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

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