gpt4 book ai didi

java - 如何使用 MVVM 正确验证登录表单?

转载 作者:行者123 更新时间:2023-12-03 10:22:14 25 4
gpt4 key购买 nike

Android 主要模式是 MVP 时,我们将验证逻辑存储在 presenters 中(因为 view 应该傻点 - 如果我错了请纠正我)因为一个presenter 只针对一个view。在 MVVM 中,ViewModel 不知道使用此 ViewModelView 和(据我了解)一个 ViewModel 可以被不同的Views 使用而不会违反MVVM 理念。因此,问题是在 MVVM 中的何处验证登录表单?什么是意识形态上正确的解决方案?

最佳答案

我在 android 中看到过很多 MVVM 模式的实现。我在我的项目中遵循以下结构。我不知道这是否理想。有错请指正。

首先让我回答你的问题,

where to validate a login form in MVVM ?

我在 ViewModel 中进行验证

class LogInViewModel : ViewModel() {

...

fun performValidation() {

if (username.isBlank()) {
logInResult.value = "Invalid username"
return
}

if (password.isBlank()) {
logInResult.value = "Invalid password"
return
}

logInResult.value = "Valid credentials :)"
}

}

What is the ideologically correct solution?

正如我所说,我们可以遵循许多结构来在 android 中实现 MVVM。下面给出了我如何做的例子。代码中充满了注释,所以我相信它是可以 self 理解的。无论如何,请随时在评论中要求任何澄清。 (为了可读性,我从布局文件中删除了一些代码)

screenshot

LogInViewModel

class LogInViewModel : ViewModel() {

/**
* Two way bind-able fields
*/
var username: String = ""
var password: String = ""

/**
* To pass login result to activity
*/
private val logInResult = MutableLiveData<String>()

fun getLogInResult(): LiveData<String> = logInResult

/**
* Called from activity on login button click
*/
fun performValidation() {

if (username.isBlank()) {
logInResult.value = "Invalid username"
return
}

if (password.isBlank()) {
logInResult.value = "Invalid password"
return
}

logInResult.value = "Valid credentials :)"
}

}

登录处理程序

/**
* To pass UI events to activity
*/
interface LogInHandler {

/**
* Will be called when login button gets clicked
*/
fun onLogInClicked()
}

activity_login.xml

<layout>

<data>

<variable
name="viewModel"
type="com.theapache64.mvvmloginsample.LogInViewModel" />

<variable
name="handler"
type="com.theapache64.mvvmloginsample.LogInHandler" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout>

<EditText
...
android:text="@={viewModel.username}" <!--Two way binding username-->
/>

<EditText
...
android:text="@={viewModel.password}" <!--Two way binding password-->
/>

<Button
...
android:onClick="@{()->handler.onLogInClicked()}" <!--Invoked on button click-->
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

最后是 Activity

登录 Activity

class LogInActivity : AppCompatActivity(), LogInHandler {

private lateinit var viewModel: LogInViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// Binding
val binding =
DataBindingUtil.setContentView<ActivityLoginBinding>(this, R.layout.activity_login)

// ViewModel
this.viewModel = ViewModelProviders.of(this).get(LogInViewModel::class.java)

// Setting binding params
binding.viewModel = viewModel
binding.handler = this

// Watching for login result
viewModel.getLogInResult().observe(this, Observer { result ->
Toast.makeText(this, result, Toast.LENGTH_SHORT).show()
})
}

override fun onLogInClicked() {
viewModel.performValidation()
}

}

我在 GitHub 中托管了完整的源代码。你可以从here得到它

关于java - 如何使用 MVVM 正确验证登录表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57167685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com