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