问题标签 [android-mvvm]

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 投票
0 回答
4288 浏览

kotlin - MVVM Activity 中的 Mock ViewModel

更新 29/04/18

重新命名以获得更好的准确性。问题很简单:不能简单地在活动上模拟ViewModel ,因为它们是在活动的 onCreate() 中实例化的。解决这个问题的最佳方法是什么?

一些相关的想法位于此处(未成功尝试实施)

原始问题

使用 Google 的 MVVM GithubBrowserSample 代码库,我正在尝试进行仪器测试以检查加载状态是否会引发进度条。具体来说,是UserFragmentTest.loading() 方法的镜像。这是非常简单的东西,我试图将我的设置与谷歌的设置紧密匹配。

但是我可以看到这是不对的。具体来说,当我明确要求它们不在我的测试函数中时,我可以看到正在调用我的 ViewModel (VM) 中的@Before函数。我正在使用 Kotlin、Dagger2 和架构组件。

当我运行UserFragmentTest.loading()测试时,我可以看到代码在 VM 中确实没有调用任何内容(甚至没有调用构造函数)。BaseActivity然而,即使我要求它返回虚拟数据,我也会调用 VM init 块(设置)和 getUser() 函数。我能看到的唯一主要区别是我的是一个 Activity,而 Google 正在测试一个 Fragment,而 ViewModel 模拟函数使用的是 Niek Haarman 的Mockito-Kotlin库。

登录活动测试.kt

登录活动.kt

登录视图模型.kt

运行测试后的Logcat:

编辑: 看起来这里的问题是虚拟机没有正确模拟。这里这里有几个相关的问题,它们有非常相似的问题。注入的 VM 工厂首先在基础活动的 onCreate 中使用,但活动需要存在才能覆盖它以使用我们的模拟 VM。

0 投票
1 回答
365 浏览

android - Android MVVM 架构 - ViewModel 中的 Android 引用/导入

基于您不应该将 Android 视图或其他纯 Android 组件传递给ViewModel,或者在那里有 android 导入的想法,请考虑下一个用例:

从我的Fragment 我想启动某种图像处理操作,为此我需要使用我想要显示结果的当前 xml 视图初始化我的对象。因此,我使用视图组件在“片段”端创建它,然后将该对象传递给ViewModel.

我的问题是:

  1. 我正在传递ViewModel一个已经引用 Android 视图的对象。

  2. 中的逻辑ViewModel创建一个Bitmap并在处理后将该位图返回给观察它的片段,因此我在我的内部引用了一些 Android 位图库ViewModel

ViewModel如果我需要在那里完成工作,如何避免引用 Android 的东西?

0 投票
1 回答
2951 浏览

android - mvp中的presenter和mvvm中的view-model有什么区别

我需要澄清我对 mvp 和 mvvm 设计模式的一些疑虑

1)在更新视图的mvp和mvvm中。presenter/view-model设置要在视图中显示的数据或视图从presenter/view-model中检索数据并显示它

2) 演示者和视图模型如何彼此不同。“ MVVM 使用数据绑定来更新视图,而演示者使用传统方法来更新视图”。是吗?

0 投票
2 回答
4260 浏览

android - 使用 ViewModel、LiveData 和 RxJava 在 recyclerview 中处理数据和加载指示器的正确方法

从数据源搜索项目时,我有以下 UI 流程:

  1. 从源检索时显示进度指示器 -> 将 livedata 分配给Outcome.loading(true)
  2. 显示结果 -> 分配 LiveDataOutcome.success(results)
  3. 隐藏进度指示器 -> 分配 LiveDataOutcome.loading(false)

现在的问题是当应用程序在后台时调用#2 和#3。恢复应用程序时,LiveData 观察者只被通知 #3 而不是 #2 导致未填充的 RecyclerView。

处理这种情况的正确方法是什么?

下面是我的成果课

0 投票
0 回答
38 浏览

android - 图书馆让我的项目变慢

我是 android 应用程序开发的新手。我已经构建了具有类基础活动BaseActivity的简单 android 库

我已将库上传到 github:https ://github.com/ubheamar/android_core/

现在我正在尝试使用 jitpack 来获取 android 项目的库。
implementation 'com.github.ubheamar:android_core:master-SNAPSHOT'

但是当我在另一个项目中使用这个库时,android studio 会变慢。

0 投票
1 回答
1697 浏览

android - 我们可以在单个活动中添加多个 ViewModel.observer() 方法吗

我有一个执行多个后台任务的活动,例如:

getJWTToken(), sendFCMTokenToServer(), isPromoAvailable(), isForcedUpgradeRequired(), fetchNewsFromServer(), sendUserLatLngToServer()

这些都是网络调用,需要一些时间。

这就是我为 1 方法所做的。

现在我的问题是我是否需要homeViewModel.observer(this, )为每种方法重复上述行,或者还有其他方法可以实现这一点。

0 投票
1 回答
2266 浏览

android - 我们应该为每个 Activity 创建单独的存储库还是为整个应用创建单个存储库

我正在关注MVVM我的应用程序的架构。getNews()在活动中,如果新闻尚未缓存,我需要从 URL 获取。

Activity 将要求ViewModel提供News JsonViewModel查看存储库,并决定从本地或远程存储库发送数据。

现在混淆源于以下几点:我应该为每个 Activity 创建一个单独的 Repository 类,还是为每个 Activity 与之通信的整个项目创建一个通用的 Repository 类。在第二种方法中,存储库类将是巨大的。

我无法找到有关此主题的任何官方指南,我想知道这方面的最佳实践。

0 投票
1 回答
5121 浏览

android - 在没有实时数据的情况下使用 ViewModel 可以吗

我在需要等待响应LiveData的课堂上使用,但在某些情况下,我需要从 local 检查一些值,这不会阻塞任何线程。AndroidViewModelshared preference

对于这些场景,我没有使用LiveData. 这就是我在我的activity class.

我想知道上述方法是否可以,或者我们必须LiveData为每个方法使用或其他一些观察者ViewModel

0 投票
1 回答
2364 浏览

android - 在不使用 Room 的情况下使用 LiveData 和 ViewModel

对于 android MVVM 架构,在我看到的所有示例中,人们要么使用 Room 来存储/检索数据,要么通过 Repository 类直接从 API 调用中获取数据。

我既没有进行 API 调用,也没有使用 Room 数据库来存储数据。但是我需要我的 ViewModel 从存储库中获取数据并将其传递给我的 Activity。

如果您不打算使用 Room 在本地保存数据,您的 Repository 类是否可以从 Application 类继承,以便您可以保存静态变量/伴随对象?

处理这种情况的好方法是什么?

0 投票
1 回答
5470 浏览

android - 是否可以使用返回字符串的 ViewModel 方法设置 TextView 的文本?

是否可以使用返回字符串的方法更改 TextView 的文本?

出于培训目的,我创建了这个ViewModel类,它将User对象放入List<User> mUserList其中,我想知道我是否可以使用 ViewMode 方法将此用户的名字设置为 TextView 的文本。我收到绑定错误,是否可以使用不使用 @BindingAdapter 注释返回 String 的方法来解决此问题?

编辑:当我设置android:text="@{viewmodel.userList.toString()}"它不返回绑定错误但它返回用户对象的字符串表示。但是当我使用android:text="@{viewmodel.getUserFirstNames()}"我得到一个绑定错误。为什么会这样?

在 MainActivity 我假装使用公共类 MainActivity 加载数据扩展 AppCompatActivity {

在布局中我想知道是否可以使用 ViewModel 类设置 TextView 的文本