一、什麼是擴充套件
Kotlin 可以對一個類的屬性和方法進行擴充套件,且不需要繼承或使用 Decorator 模式。 擴充套件是一種靜態行為,對被擴充套件的類程式碼本身不會造成任何影響。
擴充套件類似是一個設定了使用者的外接裝甲。只要符合使用條件,就可以使用這種裝甲。
二、為什麼要用擴充套件
擴充套件最直接的好處,程式碼少,寫得快
舉個例子,view的點選方法
Java最簡潔的方式
findViewById(R.id.button).setOnClickListener(v -> doSomeThing();
複製程式碼
Kotlin最簡潔的方式
button.click{
doSomeThing()
}
fun <T : View> T.click(block: (T) -> Unit) = setOnClickListener{
block(it as T)
}
複製程式碼
附加福利
眾所周知,android開發中, view的重複點選是一個很常見的需要解決的問題。解決方案也很多,rxbindig,重新Listener,listenr中判斷時間間隔。但都有一個缺點,程式碼太多啦。上吧,烤特林!
/**
* 擴充套件屬性 延時觸發 即多少時間內重複點選無反應
*/
private var <T : View> T.triggerDelay: Long
get() = if (getTag(1123461123) != null) getTag(1123461123) as Long else -1
set(value) {
setTag(1123461123, value)
}
/**
* 擴充套件屬性 上次點選事件時間
*/
private var <T : View> T.triggerLastTime: Long
get() = if (getTag(1123460103) != null) getTag(1123460103) as Long else 0
set(value) {
setTag(1123460103, value)
}
/**
* 私有擴充套件方法 計算是否過了延時期
*/
private fun <T : View> T.delayOver(): Boolean {
var flag = false
val currentClickTime = System.currentTimeMillis()
if (currentClickTime - triggerLastTime >= triggerDelay) {
triggerLastTime = currentClickTime
flag = true
}
return flag
}
fun <T : View> T.clickWithTrigger(time: Long = 600, block: (T) -> Unit) {
triggerDelay = time
setOnClickListener {
if (delayOver()) {
block(it as T)
}
}
}
// 使用
button.clickWithTrigger{
doSomeThing()
}
複製程式碼
就這樣一行程式碼,解決view重複點選
好用的擴充套件在哪裡
我搜集了一些kotlin常用的程式碼在裡面,有需要的小夥伴可以扣一些下來用 github.com/luckyAF/Kom…
再舉幾個常用的?
activity擴充套件
jumpTo<TestActivity>()
jumpToForResult<TestActivity>(null) { resultCode, data ->
}
複製程式碼
log擴充套件
data.DEBUG()
複製程式碼
資料擴充套件
data.addTo(arrayList)
複製程式碼
總結
總的來說,擴充套件其實類似於語法糖,挺好用的。假如大家有實用的擴充套件也可以交流一下