一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
之前写过一篇文章优雅读取Activity的Intent、Fragment的Argument,这个主要是从Kotlin属性委托的角度来封装
Intent、Argument
读写的,本篇文章将从另一个角度利用Kotlin运算符重载、带接收者的扩展函数来封装下
包装类封装Intent
操作
class IntentWrapper2(private val mIntent: Intent) {
//读取Intent
fun <T> getValue(key: String, default: T): T? {
return when(default) {
is String -> mIntent.getStringExtra(key)
is Boolean -> mIntent.getBooleanExtra(key, default)
is Int -> mIntent.getIntExtra(key, default)
else -> throw Exception("do not support the type")
} as T?
}
//写入Intent
fun <T> setValue(key: String, default: T) {
when(default) {
is String -> mIntent.putExtra(key, default)
is Boolean -> mIntent.getBooleanExtra(key, default)
is Int -> mIntent.getIntExtra(key, default)
else -> throw Exception("do not support the type")
}
}
}
上面只是简单了罗列了下String
、Int
、Boolean
类型的读写,其他的类型诸如Double
、数组
等请根据需求自行添加。
使用方式如下:
private val mIntents by lazy(LazyThreadSafetyMode.NONE) {
IntentWrapper2(intent)
}
fun test() {
val value = mIntents.getValue("key", "haha")
}
可以看到这样使用起来很麻烦:
- 麻烦1:手动构造
IntentWrapper2
对象且给其传入当前AppCompatActivity
的Intent
对象,优化如下:
fun AppCompatActivity.optIntent(): Lazy<IntentWrapper2> = lazy {
IntentWrapper2(intent)
}
定义了一个接收者为AppCompatActivity
的扩展函数,这样Intent
就不用通过外部传入了:
private val mIntents by optIntent()
- 麻烦2:通过
mIntents.getValue()/setValue()
读写Intent太过于麻烦,这个可以利用运算符重载set
、get
进一步简化:
只需要把最上面定义的setValue
、getValue
方法增加operator
且方法名分别改为set
、get
即可,看下基本使用:
//read
val value = mIntents["key", "haha"]
//write
mIntents["key"] = "haha2"
使用起来是不是特别的简单,这个封装思想和我之前写的一篇关于SharedPreference
读写封装的思想基本一致:三.委托与SharedPreference的结合
对于Fragment
的argument
读写的封装和Intent
类似,这里就不再进行过多阐述了。
总结
相比较于Kotlin的属性委托封装Intent
读写,使用文章中的这种封装方法需要用户手动指定Intent
读写的key
键,但是好处是只用创建一个包装者IntentWrapper2
对象即可。