我正在开发一个有登录表单的应用程序。我对模式有点困惑,因为我不明白登录成功后我将如何打开新活动。根据我点击提交时的理解按钮 viewmodel 中验证的方法将被调用,在我成功登录后,我不知道如何将其导航到活动文件,以便我可以调用新活动。
3 回答
拇指规则:
android.* 中的任何包都不应该位于 ViewModel 中。您可以忽略 ViewModel 的包导入
此外,您也可以使用普通的 ViewModel 来做到这一点。
如何进行?
让我们让它变得简单。假设,您正在制作登录页面。
让我们在 ViewModel 本身中有以下内容:
- 具有双向绑定的电子邮件和密码字段
- 表单验证逻辑
- 按钮点击事件
- API 调用
所有这些都在您的 ViewModel 中。
现在,您的 Activity 需要对 Api 调用的结果做出反应。因此,让您的 ViewModel 有一个单独的 LiveData,其中 T 是来自您的 Api 调用的响应类型。
例如:
val loginApiStatus = MutableLiveData<LoginResponse>()
然后,让你的 Activity 观察这个 LiveData。应在onStart()
Activity的方法中观察。我会告诉你观察的原因onStart()
。
viewModel.loginApiStatus.observe(this, Observer{ loginResponse->
// respond accordingly
})
现在,一旦您收到来自 Api 的响应,只需将 ViewModel 中的 LiveData 更新为:
loginApiStatus.value = loginResponse // Login Api Response
使用这种结构,您可以完全控制处理 Api 响应。即使您的 Activity 进入后台,在启动 Api Call 后,您仍将了解该 Api 调用发生的情况。现在,当您再次从后台返回登录屏幕时,您将再次开始观察 LiveData(因为我们正在观察 LiveData 的状态,onStart()
正如我之前所说的),您将获得状态来做出反应。
当您开始在 ViewModel 本身中存储 View / Fragment / Activity 的状态时,生活会变得容易得多。
为此,您可以使用提供应用程序上下文的 AndroidViewModel,然后使用意图导航到新活动。
您可以简单地在活动中实现点击侦听器并从那里处理打开新活动。据我所知,ViewModel 应该只用于持久化数据或与 Repository/model 进行其他通信。它不应该用于导航。
虽然如果你想使用那么你可以使用 AndroidViewModel 类,它提供了一个上下文对象,可用于导航到另一个活动/片段。