Skip to content

我用的一些扩展 #7

@imtianx

Description

@imtianx

1、Intent 获取参数,以 String 为例:

fun Activity.extraString(key: String, default: String = ""): Lazy<String> = lazy {
    intent?.extras?.getString(key) ?: default
}

示例:

 private val vinCode: String by extraString(DATA_VIN_CODE)

2、Boolean 的扩展,链式调用:

object Otherwise : BooleanExt<Nothing>()
class TransferData<T>(val data: T) : BooleanExt<T>()

inline fun <T> Boolean.yes(block: () -> T): BooleanExt<T> = when {
    this -> TransferData(block.invoke())
    else -> Otherwise
}

inline fun <T> BooleanExt<T>.otherwise(block: () -> T): T = when (this) {
    is Otherwise -> block.invoke()
    is TransferData -> this.data
}

示例:

isNotEmpty().yes {

}.otherwise {

}

这样嵌套用多了代码又丑又难阅读😂

3、view 防止多次点击

  • 通过时间判断
fun View.singleClick(clickEventFun: () -> Unit) {
    this.setOnClickListener {
        if (Utils.isFastClick()) {
            clickEventFun.invoke()
        }
    }
}
  • 使用 rxjava 去重(目前已废弃),
@SuppressLint("CheckResult")
@Deprecated("memory leak")
fun View.singleClick(
    intervalDuration: Long = 1,
    unit: TimeUnit = TimeUnit.SECONDS,
    eventFun: () -> Unit
) {
    Observable
        .create(object : ObservableOnSubscribe<View> {
            lateinit var mEmitter: ObservableEmitter<View>

            init {
                [email protected] {
                    mEmitter.onNext(it)
                }
            }

            override fun subscribe(emitter: ObservableEmitter<View>) {
                mEmitter = emitter
            }
        })
        .throttleLast(intervalDuration, unit)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe {
            eventFun()
        }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions