问题标签 [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 投票
2 回答
8673 浏览

android - Lateinit 属性 viewModelFactory 尚未在 Fragment 中初始化

我在我的 android 项目中使用 dagger 2(版本 2.15)进行依赖注入。除了注入 viewModelFactory 一切正常。我无法将它注入我的片段中。

我收到以下错误:

我有 ViewModelModule:

视图模型键

和 ViewModelFactory

虽然我不太明白他们在做什么。

0 投票
2 回答
7833 浏览

android - Android数据绑定在自定义视图中注入ViewModel

我要关闭这个 stackoverflow 答案https://stackoverflow.com/a/34817565/4052264以将数据对象绑定到自定义视图。然而,在一切都设置好后,我的视图没有用数据更新,而是TextView保持空白。这是我的代码(简化,为了适合这里)

activity_profile.xml::


view_profile.xml


MyProfileCustomView.kt



ProfileViewModel.kt

一切正常,API 调用profileManager.profile()成功,ViewProfileBinding使用正确的设置成功创建了类。问题是当我这样做时name.postValue(profile.name),视图没有更新为profile.name

0 投票
2 回答
115 浏览

java - 在这种情况下,哪个语句将首先执行?

我一直在尝试让 Junit 测试等待异步任务完成但被卡住了。假设我们有这样的课程

这是我的测试方法

我面临的问题是该verify语句之前displayData在内部类中被调用MyViewModel并且测试用例失败。我该如何解决这个问题?也欢迎任何其他测试相同功能的方式。

0 投票
1 回答
4420 浏览

android - MVVM - 使用 RxJava 和 Room 处理 ViewModel 中的 Disposable-s

我尝试在我的 Android 活动中应用 MVVM 模式(我是一个 Android 菜鸟)。

我将 Room 与 RxJava 2 一起使用,例如,这是我的存储库中方法的签名:

在我的ViewModel类中,我引用了存储库和如下代码:

到目前为止一切顺利,表面上看起来一切正常。现在 -subscribe返回一个Disposable.

我的问题是:

  1. 我应该如何处理一次性用品(例如,我可以将它放入复合一次性用品中,并在模型清除后处理复合材料)?
  2. 如果我不处理它会发生什么?泄漏?为什么?

在我经历的一些示例中,没有处理 Disposable。

更新:我在android-architecture-components中看到了复合一次性用品的使用。

谢谢。

0 投票
0 回答
741 浏览

android - 如何使用 Dagger2 在 ViewModels 中注入依赖项

我正在尝试在我现有的项目中实现新架构(MVVM + RxJava2 + Dagger2 + Retrofit)。我已经建立了整个以上架构并在 HomeActivity 上进行了测试。在 HomeViewModel 中注入的依赖项。所以现在我试图在 FollowFragment 的 FollowViewModel 中注入与 HomeViewModel 相同的依赖项,这是 HomeActivity 的容器片段。但是注入的依赖项总是返回 null(不是 Initiziling)。

我正在关注这个项目riggaroo/android-arch-components-date-countdown来注入依赖项,但在这个示例中,只使用活动而不使用片段。所以我不知道发生了什么以及谁在多个 ViewModel 中注入 deps。

以下是一些需要理解的重要类的代码:

AppApplication.class

AppInjector.class

应用组件类

应用模块类

ActivityBuilderModule.class

FragmentBuildersModule.class

ViewModule.class

NetworkModule.class

MyViewModelFactory.class

此类用于创建所有视图模型的实例。我已经调试并发现只有 HomeViewModel 实例正在创建。

现在我创建了从 HomeActivity 调用的 HomeViewModel。哪个工作正常。现在在 FollowFragment 中完成了相同的实现,但不起作用。让我向您展示我如何从 FollowListFragment.class 初始化 FollowViewModel

这是FollowingViewModel.class

这是工作正常的 HomeActivity 和 HomeViewModel 类代码。HomeActivity.class

HomeViewModel.class

0 投票
1 回答
424 浏览

android - Android 中的 RecyclerViewAdapter 或 ListAdapter 等 Adapter 与 ViewModel(架构组件)有什么区别?

我仍在学习 Android 编程并试图理解 ViewModel 的概念。视图模型背后的主要动机(在几乎所有的视图模型教程中)是保持数据与生命周期事件无关。我发现 ListView 或 Recyclers 下使用的适配器也提供此功能,因为在新创建的 Activity 中创建的视图使用相同的适配器。我想知道两者之间的确切区别是什么?

根据我目前的理解,ViewModel 能够为 Activity 中的所有视图提供与生命周期无关的数据,但是 Adapter(尽管它们可以提供相同的东西)只能在某些视图上工作。我的理解正确吗?

0 投票
1 回答
759 浏览

android - 如何使构造函数中带有 id 参数的 ViewModelFactory 可注入?

我在带有 Dagger 的 Android 中使用 ViewModel 来管理依赖项。我的 ViewModel 将在创建时从 MainActivity 获取一个 id。所以我在这里有这些代码:

在活动中:

我的工厂供应商:

为了工作,我需要向我的模块添加一个参数:

或者我可以直接在组件中做它并使其抽象。在新的 Dagger 中,我可以使用 Dagger 类来制作活动或片段组件。因此,我应该为每个活动创建子组件,并为我应该编写的其他代码创建一个 Builder 和音调。

是否有任何简单和更好的方法来防止这些额外的代码,或者我最好通过在这样的活动中调用一个新工厂来创建我的工厂?:

0 投票
0 回答
846 浏览

android - 如何使用 ViewModel 和 LiveData 高效且频繁地查询 Room 数据库?

编辑:我本质上问的是什么。

在 SQLite 中,我可以像这样从我的查询中创建一个游标:

我可以在其中传递不同的列、searchClauses 或 selectionArgs 以通过查询查明我想要的数据。

房间数据库相当于什么?

编辑 2:此外,如果我查询数据库,我会收到一个列表,其中包含存储在数据库中的所有项目。从那里我想创建另一个列表,将项目合并到另一个列表中。例如,如果我在数据库中有三个蓝色项目,我想显示一个带有“蓝色”项目的列表项,它还显示这三个项目的平均售价。因此,新列表将包含所有颜色项目,合并为每种颜色的一个列表项目,以及它们各自的平均售价。

我该怎么做呢?


好的,所以我的应用程序有一个相当大的数据库,其中包含 50 列。大多数列可以采用用户输入定义的各种值。

我将在我的应用程序中以不同的片段(在同一个活动中)显示这些数据,在其中使用 listViews。

因此,我最初的方法是对 Room 进行大量但很小的查询,以便在需要的地方获取所需的数据。但是,在使用 ViewModel/LiveData 架构时,我不知道如何进行这些查询。

例如,在我的 Dao 中,这可能是一个查询:

当我想制作一个显示颜色和平均值的列表时,我会使用它。以售价为例。一个列表项可以有一个项目(例如蓝色)或两种或多种颜色组合(黑色和黄色),所以这就是我需要使用字符串[] 的原因。(我的应用与鞋子/颜色无关,我只是以此为例)..

为了达到这个查询,我必须设置一个带有工厂的 ViewModel对吗?像这样:

}

然后我会像这样查询我的 Activity 或 Fragment 中的数据。我必须将我定义的 colour[] 与我想查询的颜色一起传递给工厂。

这是我的问题/问题所在:

如果我想为我的第一个列表项查询“蓝色”。我的第二个是 {"black","yellow"},然后是我的第三个列表项的其他颜色。每次都要新建一个工厂,然后在 ViewModel 上设置新工厂吗?a 我还能如何检索这些数据?这只是一个小例子:有时我想要平均。按鞋码列出的售价。有时我想按颜色查询最受欢迎的鞋码。

我的真实数据库有 50 列,其中包含大量不同的潜在查询,它们都需要传递不同数量/类型的参数。我怎样才能使所有这些查询来填充不同的 listViews/RecyclerViews 呢?不可能我每次都必须创建一个新工厂并创建数十个 ViewModel 以允许传递的每个参数类型和计数?或者这就像为 SQLite 中的每个查询创建一个新的游标?

基本上,我不知道如何使用 Room 进行这么多的查询。

我的替代想法:

与其进行数百个小查询(如果我知道该怎么做的话),我想我只需查询一次数据库并使用我的 ViewModel 获取所有数据。这会给我一个包含所有数据的列表。

从那里我可以在 for 循环中运行/过滤列表,以查找我想要的内容?

例如:

然后我可以通过相应适配器中的 getter 方法从 Activity 中获取这些列表,然后在那里进行进一步的操作?比如获取按颜色分隔的平均鞋码或平均售价,然后在列表中显示这些平均值?

基本上,当我只需要每个 listView 中非常具体的数据而不是所有数据时,我不确定如何将所有数据提取到多个列表视图中。

0 投票
1 回答
2816 浏览

android - 与 LiveData 一起使用时,return 语句有什么用

我遵循了这个例子,一个集成的ViewModelLiveData.

我习惯于交流LiveData,习惯于交流ViewModelRepositoryactivityViewModel

我想澄清这个问题的困惑很少。

这工作正常,并在 MainActivity 5 秒后显示 Toast 消息。

主要活动

主视图模型

登录存储库

这是我的2个问题。

  • 现在使用每种方法,我都返回了一些类型LiveData的数据,但是在返回数据时,没有设置值。我是5秒后设置data.setValue("SomeValue")的,那么return 这里有什么用,是不是因为方法返回类型的原因,万一发生什么都不做LiveData

  • MainActivity,我习惯于homeViewModel.getResponseval().observe 观察数据,但在ViewModel,我没有使用observe,但 ViewModel 仍在观察,Repository并且 5 秒后 MainActivity 得到结果。我无法理解这里发生了什么。

0 投票
4 回答
12460 浏览

android - 如何为父片段和子片段提供相同的 ViewModel 实例

有两个片段:ParentFragment 和 ChildFragment。 ChildFragment已添加到 的视图中ParentFragment

现在使用Dagger2for Android 有ParentFragmentModule一个方法:

其中 MyViewModelFactory、MyViewModel、MyViewModelImpl 是在应用程序中创建的简单 ViewModel 逻辑。

ChildFragmentModule 具有以下方法:

这显然是在创建两个单独的实例,ViewModel因为它们接收两个不同的片段实例。

我们如何让它返回相同的实例,以便在父片段和子片段之间共享数据?

我尝试在 中传递而ParentFragment不是,但这会导致 Dagger 依赖注入错误。ChildFragmentChildFragmentModule