如何将参数传递给 Kotlin 中的扩展函数

How to pass a parameter to a extension function in Kotlin

我在 kotlin 中有一个扩展函数来检查它是否是一个有效的字符串,如下所述。

fun EditText.onAfterTextChanged(listener: (String) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val input = editable?.toString()
            val allowedChars = context.getString(R.string.supported_digits)
            val newValue = replaceInvalidCharacters(input, allowedChars)
            if (newValue != input) {
                setText(newValue)
                setSelection(text.length)
            }
            listener(newValue)
        }

        override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
    })
}

private fun replaceInvalidCharacters(value: String?, allowedChars: String): String {
    var finalValue = value ?: ""
    if (finalValue.isNotEmpty()) {
        val lastChar = finalValue.last()
        if (!allowedChars.contains(lastChar, false)) {
            finalValue = finalValue.dropLast(1)
        }
    }
    return finalValue
}

我这样使用它:

editText.onAfterTextChanged {
        val length = it.length
        if (length >= 250) {
            activity?.toast(getString(R.string.max_limit_reached))
            return@onAfterTextChanged
        }
}

这里我想将 allowedChars 作为参数传递给此扩展,因为应用程序中不同的 EditText 有不同的字符串。像 1 EditText 可能只允许数字而不是 +,- 并且一些编辑文本可能只允许字母数字等。有没有办法将参数传递给扩展?

您可以做的是通过在回调函数之前添加一个参数来更新扩展函数签名。所以,它看起来像这样

fun EditText.onAfterTextChanged(allowedChars: String, listener: (String) -> Unit) {
    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val input = editable?.toString()
            val allowedChars = context.getString(R.string.supported_digits)
            val newValue = replaceInvalidCharacters(input, allowedChars)
            if (newValue != input) {
                setText(newValue)
                setSelection(text.length)
            }
            listener(newValue)
        }

        override fun beforeTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }

        override fun onTextChanged(s: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
    })
}

你可以这样称呼它:

editText.onAfterTextChanged("123abc") {
    val length = it.length
    if (length >= 250) {
        activity?.toast(getString(R.string.max_limit_reached))
        return@onAfterTextChanged
    }
}