问题标签 [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.
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。
android - Android MVVM 架构 - ViewModel 中的 Android 引用/导入
基于您不应该将 Android 视图或其他纯 Android 组件传递给ViewModel
,或者在那里有 android 导入的想法,请考虑下一个用例:
从我的Fragment
我想启动某种图像处理操作,为此我需要使用我想要显示结果的当前 xml 视图初始化我的对象。因此,我使用视图组件在“片段”端创建它,然后将该对象传递给ViewModel
.
我的问题是:
我正在传递
ViewModel
一个已经引用 Android 视图的对象。中的逻辑
ViewModel
创建一个Bitmap
并在处理后将该位图返回给观察它的片段,因此我在我的内部引用了一些 Android 位图库ViewModel
ViewModel
如果我需要在那里完成工作,如何避免引用 Android 的东西?
android - mvp中的presenter和mvvm中的view-model有什么区别
我需要澄清我对 mvp 和 mvvm 设计模式的一些疑虑
1)在更新视图的mvp和mvvm中。presenter/view-model设置要在视图中显示的数据或视图从presenter/view-model中检索数据并显示它
2) 演示者和视图模型如何彼此不同。“ MVVM 使用数据绑定来更新视图,而演示者使用传统方法来更新视图”。是吗?
android - 使用 ViewModel、LiveData 和 RxJava 在 recyclerview 中处理数据和加载指示器的正确方法
从数据源搜索项目时,我有以下 UI 流程:
- 从源检索时显示进度指示器 -> 将 livedata 分配给
Outcome.loading(true)
- 显示结果 -> 分配 LiveData
Outcome.success(results)
- 隐藏进度指示器 -> 分配 LiveData
Outcome.loading(false)
现在的问题是当应用程序在后台时调用#2 和#3。恢复应用程序时,LiveData 观察者只被通知 #3 而不是 #2 导致未填充的 RecyclerView。
处理这种情况的正确方法是什么?
下面是我的成果课
android - 图书馆让我的项目变慢
我是 android 应用程序开发的新手。我已经构建了具有类基础活动BaseActivity的简单 android 库
我已将库上传到 github:https ://github.com/ubheamar/android_core/
现在我正在尝试使用 jitpack 来获取 android 项目的库。implementation 'com.github.ubheamar:android_core:master-SNAPSHOT'
但是当我在另一个项目中使用这个库时,android studio 会变慢。
android - 我们可以在单个活动中添加多个 ViewModel.observer() 方法吗
我有一个执行多个后台任务的活动,例如:
getJWTToken(), sendFCMTokenToServer(), isPromoAvailable(), isForcedUpgradeRequired(), fetchNewsFromServer(), sendUserLatLngToServer()
这些都是网络调用,需要一些时间。
这就是我为 1 方法所做的。
现在我的问题是我是否需要homeViewModel.observer(this, )
为每种方法重复上述行,或者还有其他方法可以实现这一点。
android - 我们应该为每个 Activity 创建单独的存储库还是为整个应用创建单个存储库
我正在关注MVVM
我的应用程序的架构。getNews()
在活动中,如果新闻尚未缓存,我需要从 URL 获取。
Activity 将要求ViewModel
提供News Json
并ViewModel
查看存储库,并决定从本地或远程存储库发送数据。
现在混淆源于以下几点:我应该为每个 Activity 创建一个单独的 Repository 类,还是为每个 Activity 与之通信的整个项目创建一个通用的 Repository 类。在第二种方法中,存储库类将是巨大的。
我无法找到有关此主题的任何官方指南,我想知道这方面的最佳实践。
android - 在没有实时数据的情况下使用 ViewModel 可以吗
我在需要等待响应LiveData
的课堂上使用,但在某些情况下,我需要从 local 检查一些值,这不会阻塞任何线程。AndroidViewModel
shared preference
对于这些场景,我没有使用LiveData
. 这就是我在我的activity class
.
我想知道上述方法是否可以,或者我们必须LiveData
为每个方法使用或其他一些观察者ViewModel
android - 在不使用 Room 的情况下使用 LiveData 和 ViewModel
对于 android MVVM 架构,在我看到的所有示例中,人们要么使用 Room 来存储/检索数据,要么通过 Repository 类直接从 API 调用中获取数据。
我既没有进行 API 调用,也没有使用 Room 数据库来存储数据。但是我需要我的 ViewModel 从存储库中获取数据并将其传递给我的 Activity。
如果您不打算使用 Room 在本地保存数据,您的 Repository 类是否可以从 Application 类继承,以便您可以保存静态变量/伴随对象?
处理这种情况的好方法是什么?
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 的文本