MVVM+Kotlin+数据绑定最佳实践

问题描述 投票:0回答:2

我正在 MVVM+Kotlin+Databinding 上构建一个应用程序,我遇到了这种情况。 我有

LoginFragment
,它有一个电话号码 edittext 和一个按钮, 现在我需要检查当用户单击按钮时电话号码是否为空。 通常我会在我的片段中使用这段代码来做到这一点。

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

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

android mvvm kotlin android-databinding
2个回答
2
投票

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

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

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% 确定它是) - 那么您就做错了。


0
投票

如果您知道如何使用两种方式数据绑定,您可以像这样直接检查视图模型 在 EdittextView 的布局中

android:text="@={view_model.phone}"

在 ViewModel 中,您将有文本可观察变量

val phone = ObservableField<String?>()

现在你可以像这样在 ViewModel 中添加 if check inside save 函数

fun save() {
    if (phone.get()?.isNotEmpty == true) {
        // TODO: do something what you want to do
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.