我尝试过使用jakewharton的数据绑定库以及一些有用的扩展方法来实现与RxJava(Kotlin)中的数据绑定基本相似的东西。
我的问题是,这样做对吗?这个足够用于生产吗?这种方法是否存在我没有看到的潜在问题,这些问题会在以后出现?
基本上,我是这样实现的:
我有一个
MvvmFragment
(活动有一个类似的类)负责设置和管理
CompositeDisposable
然后,在我的
ViewModel
(android Arch ViewModel包的一部分)我有所有要绑定的字段,声明如下:
var displayName = BindableVar("")
var email = BindableVar("")
var signInProvider = BindableVar<AuthProvider>(defaultValue = AuthProvider.PASSWORD)
(旁注-由于Rx不允许空值,我不确定如何处理对象的默认情况,这些对象的默认概念实际上没有意义,例如
AuthProvider
这个
BindableVar
类的实现方式如下:
class BindableVar<T>(defaultValue: T) {
var value: T = defaultValue
set(value) {
field = value
observable.onNext(value)
}
var observable = BehaviorSubject.createDefault(value)!!
}
fun Disposable.addTo(compositeDisposable: CompositeDisposable): Disposable {
compositeDisposable.add(this)
return this
}
fun TextView.bindTextTo(string: BindableVar<String>): Disposable {
return string.observable.subscribe(this.text())
}
fun View.bindVisibilityTo(visibility: Int) {
// ... not shown
}
fun ImageView.bindImageUriTo(
src: BindableVar<Uri>, @DrawableRes placeholder: Int? = null
): Disposable {
return if (placeholder == null) {
src.observable.subscribe {
GlideApp.with(context).load(it).into(this)
}
} else {
src.observable.subscribe {
GlideApp.with(context).load(it).placeholder(placeholder).into(this)
}
}
}
视图模型
initBindings()
,看起来像这样:
item_display_name_value.bindTextTo(viewModel.displayName).addTo(bindings)
item_email_address_value.bindTextTo(viewModel.email).addTo(bindings)
item_profile_picture_view.bindImageUrlTo(viewModel.avatarUrl).addTo(bindings)
我不想花一周时间充实这个架构,然后突然意识到有一些关键问题无法轻易解决,或者其他一些隐藏的问题。我应该只使用基于XML的数据绑定吗?我听到了很多关于单元测试的困难和重用代码的抱怨。