android - MVVM+Kotlin+数据绑定(bind)最佳实践

标签 android mvvm kotlin android-databinding

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

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

但是根据experts我的 View 不应该了解任何有关业务逻辑的信息,因此我需要在我的 viewModel 中进行此检查。 那么实现这一目标的最佳方法应该是什么?

最佳答案

以下是实现这一目标的投注实践(从我的角度来看):

在布局中添加文本观察器和文本到 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 的操作。如果您使用 !! 使可能可为 null 的对象看起来像是不可为 null 的(即使您 100% 确定它是) - 那么您就做错了。

关于android - MVVM+Kotlin+数据绑定(bind)最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50499675/

相关文章:

android - 显示教程

wpf - 有人可以建议使用 WPF 和 PRISM 的良好工作流程吗?

testing - 使用多个 `--tests`

android - 如何更改 android compose TextField 的内容填充?

java - 导入 google-play-service 依赖红十字

android - 前台服务重启后多次接收BluetoothGattCallback

wpf - WPF中的文本框键入事件

c# - 如何处理 WPF/MVVM 应用程序中的依赖注入(inject)

properties - 为什么在 init block 中初始化变量接口(interface)属性的代码不能编译?

android - android maps v2 上的聚类标记