问题标签 [android-viewmodel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
62921 浏览

android - AndroidViewModel 与 ViewModel

随着 Android 架构组件库的引入,引入了几个新类,包括AndroidViewModelViewModel. 但是,我无法弄清楚这两个类之间的区别。该文档简洁地描述AndroidViewModel如下:

应用程序上下文感知ViewModel

我很欣赏简洁,但这究竟意味着什么?我们什么时候应该选择使用AndroidViewModelover ViewModel,反之亦然?

0 投票
2 回答
10604 浏览

android - ViewModel 能否在 Activity 保存和恢复中存活?

ViewModel如果以下列方式使用,新类的实例可以在配置更改后继续存在:

但是,除了配置更改之外,还有一个保存-恢复的场景,即整个应用程序的进程都被杀死了。

ViewModel在保存-恢复场景中会保留里面的字段值吗?


编辑:基于这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous

0 投票
1 回答
1940 浏览

android - Android LiveData 修改问题

我想使用 Android 新架构组件在我的 Android 应用程序中显示产品列表。我有一个 Pojo 类Products,如下所示:

网络服务返回带有分页的列表:

所以每次产品列表调用,我都会得到一组带有其他数据的产品列表。我已经定义了调用相同的方法ProductListRepository

但是我在设置 LiveData 时遇到了问题,ProductViewModel因为我想将 ListProductDetails与较旧的 List 合并,并更新其他变量的值,ProductsonSaleCount, pageNo

}

谁能帮我?

0 投票
0 回答
8601 浏览

android - 安卓:视图模型。调用观察者方法失败

我正在使用新的拱门。来自谷歌的组件。

我在 Activity Login/Registering Fragments 中管理多亏了FragmentTransaction

Activity->RegisterFragment (with ViewPager) -> RegistrationSteps (adapter)

在 RegisterFragment 里面我有 ViewPager。我希望里面的所有页面ViewPager都使用相同的 ViewModel。

这些是注册步骤 ( RegistrationStepFragment),它采用父RegistrationFragment LifecycleOwner将ViewModel限定为它——我只是希望 ViewModel 被限定为这个父 Fragment。

RegistrationFragment.class继承自

继承自的注册步骤(页面)

一切顺利,直到我到达 3 页,我想移回(到第二页)然后在mViewPager.setCurrentItem(1)(第 2 页:索引:1)中抛出异常

编辑

好的,我发现当移动到上一页时,片段被重新创建调用并mViewModel.observable()收到先前的成功消息并导致 viewpager 向前移动,这导致破坏刚刚创建的片段导致错误。

解决方案是创建仅在调用 post 时才发出值的SingleEventLiveData(如果值在观察者附加之前发生更改,则不要通知观察者)

我将其标记为关闭

0 投票
1 回答
1205 浏览

android - 在 ViewModel 中更改 LiveData 以“重做”工作

所以,我刚刚开始尝试LiveData- 我正忙于一个新项目,我正在使用的地方ViewModel以及LiveData-RESTFul我用来获取数据的一些服务,它们不带参数并返回一些数据。

MVVM 范例的典型设置LiveData如下所示:

现在,当我们离开这个活动,去一个新的活动,通过使用意图或其他方式,而不是按下后退按钮(所以,finalize没有被调用) - 然后回到MyActivity- 我们当然不获取users再次,因为我们仍然应该拥有该数据。

但是,如果我们确实想再次获取它们怎么办?

从我所看到的来看,正确执行此操作的唯一方法似乎是在getUsers() LiveData对象上调用“setValue”

像这样的东西:

ViewModel看起来像这样:

我决定这样做的一个原因是因为谷歌不希望我们这样做:

为此原因:

如果这是实现,则 UI 需要在每次调用 getPostalCode() 时从以前的 LiveData 中注销并重新注册到新实例。此外,如果重新创建 UI,它会触发对 repository.getPostCode() 的另一个调用,而不是使用先前调用的结果。

有没有更好的方法来ViewModel“重做”它的repo.getUsers()调用?也许我可以创建一个方法,说“Update()”而不是“活动”,但仍然 - 它以不同的方式做同样的事情。

0 投票
0 回答
1517 浏览

android - Android架构组件和LiveData,太多的MutableLiveData对象?

在 android 架构组件发布之前,我开始从事一个项目,我拥有自己的 ViewModel,它与 Fragment 具有相同的生命周期,并且 ViewModel 状态保存在 Loader 内的 StateObject 中,以便状态可以在方向变化后继续存在。ViewModel 通过接口与 Fragment 通信。这很好用,因为 ViewModel 和 Fragment 具有相同的生命周期。我的 ViewModel 包含各种状态。它有一个 isLoading 布尔值、isEmptyStateVisible 布尔值等。每次状态发生变化时,我都会调用 view.notifyIsLoadingChanged(true/false) 之类的东西,在这种情况下,Fragment 会显示或隐藏一个微调器。

现在我将更改我的实现以将新的 ViewModel 与 LiveData 一起使用。实现 LiveData 的最快方法是更改​​ ViewModel 正在使用的 UI 界面的实现。所以我可以保留我当前的实现,只添加这个 UI 接口实现:

此类扩展的 LiveDataUI 类具有更多方法,例如:

有了这个实现,我最终会得到很多 MutableLiveData 对象,而且感觉不对。我是否在我的 ViewModel 中投入了太多的状态?我的想法是将所有逻辑都包含在 ViewModel 中,这样我就可以编写测试来验证在加载数据时 isLoading 是否为真,如果 Api 没有返回数据,则 isEmptyState 为真等。

我还注意到,如果我调用 setValue(state); 在同一个 MutableLiveData 对象上很短的时间内多次,onChanged 方法只被调用一次。那是对的吗?

0 投票
1 回答
2148 浏览

android - 了解Android架构组件示例GithubBrowserSample:ViewModelModule、ViewModel参数

涵盖 Android 架构组件的最新示例之一是Google 提供的GithubBrowserSample。我查看了代码并提出了一些问题:

  1. 我注意到ViewModelModule包含在AppModule中。这意味着所有视图模型都添加到 DI 图中。为什么以这种方式完成,而不是Module为每个 Activity/Fragment 单独提供仅提供ViewModel特定 Activity/Fragment 所需的?

  2. 在这个特定的示例中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是创建一个 setterViewModel并通过 setter 设置所需的参数?

0 投票
1 回答
1114 浏览

android - 在 Android ViewModel 中使用 AsyncTask 可以吗?

AsyncTask 对于​​数据库请求等后台作业是否安全,还是会出现内存泄漏等问题?在 ViewModel 中使用安全吗?

0 投票
1 回答
4088 浏览

android - 从 ViewModel 访问 strings.xml

我正在使用Dagger 2 DataBindng新的 Android 生命周期组件,它们具有ViewModels.

在我的内部我ViewModel怎么能访问我的strings.xml?起初我在想,将 aContext注入viewModel,但是,这只会泄漏内存。

还有其他方法吗?

0 投票
3 回答
2635 浏览

android - 从 ViewModel 执行网络操作

我正在使用 IO/17 中引入的 ViewModel。

我正在使用 android 开发人员页面上提供的以下指南。 https://developer.android.com/topic/libraries/architecture/viewmodel.html

以下是他们的示例代码。

我希望在“ loadUsers() ”方法中执行 Volley 请求。但我不能这样做,因为它需要一个“上下文”,如下所示

所以我的问题是,

  1. 是否建议(或可能)在 ViewModel 中执行网络操作?
  2. 如果是(如果可能),该怎么做?