假设我正在编写自己的 View 类,它代表可编辑字段并在里面包含 EditText tv_input:
class EditTextIconItemView : LinearLayout {
fun setInputText(text: String?) {
with (tv_input) {
setText(text)
setCharsCount(text?.length ?: 0)
setSelection(text?.length ?: 0)
}
}
fun setCharsCount(count: Int) {
tv_chars_count?.text = "$count/$MAX_LENGTH"
}
}
我想将textChanges()委托给该内部 EditText tv_input,因此我在自定义EditTextIconItemView中编写了以下代码:
fun EditTextIconItemView.textChanges() =
tv_input.textChanges().doOnNext { setCharsCount(it.length) }
这很好用,但现在我希望我的客户端代码实际上跳过初始值,所以在客户端代码中我有:
val et = EditTextIconItemView()
et.textChanges().skipInitialValue().subscribe { ... }
这需要我在EditTextIconItemView中为textChanges()明确指定返回类型:
fun EditTextIconItemView.textChanges(): InitialValueObservable<CharSequence> =
tv_input.textChanges().doOnNext { setCharsCount(it.length) }
但这不会编译,因为doOnNext返回 Observable 不能转换为InitialValueObservable。
但我实际上不希望客户端代码处理该副作用并在该视图上设置字符计数,这是EditTextIconItemView本身的责任。但我希望仍然能够判断是否在客户端跳过初始值。
我怎样才能让它工作?
谢谢你!