1

我正在开发一个有登录表单的应用程序。我对模式有点困惑,因为我不明白登录成功后我将如何打开新活动。根据我点击提交时的理解按钮 viewmodel 中验证的方法将被调用,在我成功登录后,我不知道如何将其导航到活动文件,以便我可以调用新活动。

4

3 回答 3

5

拇指规则:

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 的状态时,生活会变得容易得多。

于 2018-12-05T10:24:07.087 回答
0

为此,您可以使用提供应用程序上下文的 AndroidViewModel,然后使用意图导航到新活动。

于 2018-12-05T09:42:10.717 回答
0

您可以简单地在活动中实现点击侦听器并从那里处理打开新活动。据我所知,ViewModel 应该只用于持久化数据或与 Repository/model 进行其他通信。它不应该用于导航。

虽然如果你想使用那么你可以使用 AndroidViewModel 类,它提供了一个上下文对象,可用于导航到另一个活动/片段。

于 2018-12-05T10:10:31.470 回答