【问题标题】:MVVM+Kotlin+Databinding best practiceMVVM+Kotlin+数据绑定最佳实践
【发布时间】:2018-11-03 02:39:10
【问题描述】:

我正在 MVVM+Kotlin+Databinding 上构建一个应用程序,我遇到了这种情况。 我有LoginFragment,它有一个电话号码edittext 和一个按钮, 现在我需要检查用户单击按钮时电话号码是否为空。 通常我会通过在我的片段中使用此代码来做到这一点。

if(!binding!!.phone.text.isEmpty()) {
    //do something
}

但根据experts,我的视图不应该对业务逻辑一无所知,因此我需要在我的视图模型中进行此检查。 那么实现这一目标的最佳方法应该是什么?

【问题讨论】:

  • 如果您直接使用双向绑定到 ViewModel 的字段(LiveData/ObservableField),那么您不需要直接从绑定本身访问视图,我认为 - 事实上,那就是for 最有可能是什么数据绑定,而不仅仅是生成视图引用:p
  • 好吧,我也有点困惑,我的意思是有些人正在让他们的 viewmodel 扩展 BaseObservable,而我正在扩展 viewModel,所以我不能使用可绑定此外与 observableFields 我我只能在数据更改时更新 ui,但我还需要在单击按钮时从 edittext 获取文本,正确的方法是什么?
  • 总是从编辑文本中获取文本,这就是数据绑定的魔力。因此,您无需再访问视图即可获得它。使用最新的数据绑定,ViewModel 应该公开 LiveData,并且 Binding 应该有一个 setLifecycleOwner 方法,您可以设置 ViewModel 所属的任何人并且它应该可以工作:如,您应该能够直接在 XML 中使用 LiveData<String> 字段例如,如果 ViewModel 被指定为数据/变量,则绑定。
  • 我会给出一个真正的答案,但我还没有针对这种情况的现成代码示例,我只是知道它应该是什么样子:D

标签: android mvvm kotlin android-databinding


【解决方案1】:

这是实现这一目标的最佳实践(从我的角度来看):

在你的布局中添加文本观察器和文本到你的EditText

android:text="@{view_model.phone}"
app:addTextChangedListener="@{view_model.phoneWatcher}"

点击按钮的方法

android:onClick="@{() -> view_model.save()}"

ViewModel 中,您将拥有可观察的文本和观察者

val phone = ObservableField<String?>()

val phoneWatcher = object : TextWatcherAdapter() {
    override fun afterTextChanged(s: Editable?) {
        phone.set(s?.toString())
    }
}

现在您可以在ViewModel 内进行检查

fun save() {
    if (phone.get()?.isNotEmpty == true) {
        // TODO: do something
    }
}

另外请注意,最好避免在 Kotlin 中执行类似 binding!!.phone 的操作。如果你使用!! 使一个可能的可为空对象看起来是不可为空的(即使你 100% 确定它是)- 你做错了。

【讨论】:

  • 您好,谢谢您的回复,但我确实发现使用 textwatcher 作为问题的解决方案,但根据此博客:medium.com/@fabioCollini/android-data-binding-f9f9d3afc761 使用 textwatchers 不是最佳选择,正如@EpicPandaForce 在他的 cmets 中所说对于我的问题,最好的解决方案可能涉及 livedata 但我不知道在这种情况下如何使用它
  • 在您链接的帖子中,没有真正的理由说明为什么这不是使用TextWatcher 的好解决方案,他们唯一提到的是您需要取消订阅它,但使用ViewModel 并非如此。 LiveData 并非旨在与视图本身一起使用,您必须通过片段或活动来传递价值。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2019-04-26
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多