代码之家  ›  专栏  ›  技术社区  ›  Bassinator

Android中的这种数据绑定方法是否适合生产使用?是否存在隐患?

  •  1
  • Bassinator  · 技术社区  · 6 年前

    我尝试过使用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的数据绑定吗?我听到了很多关于单元测试的困难和重用代码的抱怨。

    0 回复  |  直到 6 年前