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

java - 房间数据库更改未触发观察者

当房间数据库更改时,我正在尝试更新 RecyclerView。但是,当数据库发生更改时,不会调用 MainActivity 中定义的观察者的 onChanged 方法。如果我让 DAO 返回 LiveData 而不是 List<> 并在我的 ViewModel 中使用 LiveData,它会按预期工作。但是我需要 MutableLiveData,因为我想在运行时将查询更改为数据库。

我的设置:

MainActivity.java

借用ListViewModel.java

借用模型道.java

应用数据库.java

0 投票
0 回答
450 浏览

android - 保持 ViewModel 数据重新创建

目前我想创建一个具有某种注册和支付流程的应用程序。

我使用MaterialStepper 库来创建一个ActivityFragments每个库代表流程中的一个步骤。

Activity一个 Android 架构组件ViewModelViewModel包含Fragment. 我对输入字段使用LiveData和双向数据绑定。一些数据在几个片段中被重用,Fragments这就是为什么我只ViewModel对几个片段使用一个。

当应用程序处于前台时,它会按预期工作,Fragments重新创建并且字段保持其值。

我现在的问题是当我暂停活动并稍后恢复时。ViewModel本身也可以重新创建,因此会丢失其数据。

在这种情况下避免数据丢失的好方法是什么?我在一篇文章中读到,您应该在其中存储一些值onSaveInstanceState(例如,重新创建的搜索查询ViewModel)。但是在我的情况下,对于大约 30 个输入字段来说,这不是很多吗?)

当用户编辑输入字段并观察对象时, Room数据库是在数据库中插入/更新值的好方法吗?LiveData(不幸的是我还没有经验Room

我会很高兴有任何帮助或示例(:

0 投票
1 回答
1484 浏览

android - 在 Android ViewModel 中注入依赖项?

嗨,我有一个 ViewModel,它有两个使用 Dagger 2.11 注入的 var。

然而,它永远不会被注入到我的 viewModel 中,而在我的应用程序的其他任何地方,这些相同的依赖 Vars 都会被初始化并完美注入

下面是我的视图模型

accountDelegator 抱怨没有初始化

下面是我如何在 MyModule.class 中绑定这个 viewModel

我的自定义应用程序

我的应用组件

我如何在活动/片段中使用此视图模型

0 投票
1 回答
3559 浏览

android - 我可以使用数据绑定将 UI 与视图模型中的数据绑定吗?

我的视图模型中有一些数据,我正在设置接收来自 livedata 的响应。我可以将这些数据绑定到我的 UI 而不是使用 pojo 吗?因此,每当我更改视图模型中的数据时,UI 也必须更改。

0 投票
2 回答
3232 浏览

android - 存储库在 Room 没有 LiveData 时返回 LiveData,而是从 REST API 获取

我正在寻找处理以下用例 wrt LiveData 处理的建议:ViewModel 为 LiveData 调用存储库(例如产品目录)。存储库首先从 LocalDataSource(Room) 检查,但如果数据不可用,则调用 RemoteDataSource(REST API)。

问题:

1) 根据 yigit here的以下评论,存储库在作为观察者订阅之前无法在 Room 中获取 LiveData 可用性状态。因此,即使数据可用,我也会得到 null 作为响应。 “LiveData 是观察数据并将其分发给观察者。在添加活动观察者之前,它不会计算值。”

由于存储库对客户端隐藏数据源,因此存储库有责任签入 Room,然后从远程源中提取。它如何检查 Room 中的数据可用性?

2) 由于 RemoteDataSource 返回的数据不是 LiveData 类型,应该怎么做才能使存储库最终返回 LiveData 给 ViewModel ?

Repository 是否应该首先将数据(来自 RemoteDataSource)插入 Room,然后查询 Room 以返回 LiveData ?它看起来相当昂贵的操作,因为在此过程中会查询 Room 两次。请指教 。谢谢 !

0 投票
2 回答
626 浏览

android - 在 Android 中看不到 ViewModel 类

我想开始在 Kotlin 项目中使用 MVVM。

build.gradle应用程序模块中,我有:

build.gradle项目中,我有:

然后我有:

但 ViewModel 不被识别为符号

我也试过:实现“android.arch.lifecycle:viewmodel:1.1.0”

它也没有工作。

少了什么东西?

0 投票
0 回答
33 浏览

android - 始终将 View 与 ViewModel 结合起来是一种好习惯吗?

许多用户定义的 View 类,可能是其中的大多数,显示任何形式的数据。总是将 View 与 ViewModel 结合起来是一个好习惯吗?

0 投票
2 回答
3296 浏览

android - 我可以将 LiveData 设为静态吗?

我不知道这是不是一个愚蠢的问题。这可能会破坏 LiveData/ViewModel 的目的。

我可以将 LiveData 设为静态吗?我的原因是我有一个来自更新信息的服务的侦听器。所以我需要从服务中“设置/更改”LiveData。

我曾经做过以下操作,它可以工作:
1. 服务更改 DB
2. ViewModel 监听 DB 更改
3. 从 liveData 更改中更新 UI

我发现这种方式太慢了。为了提高性能,我想要这样的东西:
1. 服务直接更改类对象
2. ViewModel 监听类对象更改
3. 从 liveData 更改中更新 UI

为了实现我想要的,要么我需要将 MutableLiveData 设为静态,要么让 ViewModel 类在活动之间共享相同的 ViewModel 实例。

这是个好主意吗?

0 投票
1 回答
5299 浏览

android - 没有在 Fragment 的附加 ViewModel 上调用 onCleared

ViewModel.OnCleared()当应用程序进入后台(即使已启用)时没有被调用时,我偶然发现了一个问题,Don't keep activities但我可以看到它Fragment.onDestroy()实际上被调用了。

以下代码可能有什么问题?ViewModel.OnCleared()在这种情况下,我如何才能真正被调用?

视图模型:

分段:

活动:

自己回答:

这是 com.android.support:appcompat-v7:27.1.0 的错误

如果我使用以下依赖项,我会遇到此问题:

如果我更改appcompat-v727.1.0 -> 27.0.2的版本,则按ViewModel.OnCleared()预期工作(当应用程序进入后台时我会调用)。

appcompat-v7:28.0.0-alpha1也可以,看起来这只是一个问题appcompat-v7:27.1.0

更新(2018 年 6 月)

正如@Akshay 所说,该错误已在 27.1.1 上修复。但不幸的是,并不完全。

以下场景仍未解决:

  1. Don't keep activities启用。
  2. 启动应用程序。
  3. 按下主页按钮。

在 27.0.2 上,我在 logcat 有以下输出:

这完全正确。

但是在27.1.1 到 28.0.0-alpha3上,我在 logcat 有以下输出:

正如我们所见,活动和片段已被销毁,但未使用 onCleared 通知 viewModel。

我怀疑如果Don't keep activities将被禁用并且后台的应用程序将在某个时刻被 Android 自然卸载(由于另一个应用程序要求大量资源),那么viewModel.onCleared()将不会被调用,这是非常可悲的。

PS我在这里推送了代码:https ://github.com/allco/onClearedInvestigation

并已在此处向 Google 报告此问题:https ://issuetracker.google.com/issues/110285295

更新(2018 年 8 月)

28.0.0-rc01 解决了这个问题。耶!

0 投票
1 回答
1629 浏览

android - 如何从 Android 中的视图更新视图模型

我在我的应用程序中使用Android 架构组件。我正在处理的用例实际上非常简单。

考虑一个简单的 Todo 应用程序,其中 todo-detail 片段正在观察来自 ViewModel 的实时数据,该 ViewModel 包含当前打开的 todo-item 的实例。

由于此片段处于编辑模式,它将允许用户编辑项目的属性。


用例 1

有一个带有灰色标志图标的图像按钮。当用户点击它时,该项目被标记为“高优先级”并将标志的颜色更改为红色。

为了实现这一点,我将属性更新viewModel.value.isHighPrioritytrue视图模型实例上,这会导致数据发生变化,从而导致片段监听它。如果 ,片段显示标志颜色红色viewModel.value.isHighPriority = true。所以基本上来自视图的 UI 事件会循环回到导致它更新的视图。

用例 2

考虑一个待办事项的标题。它显示在 Android 的EditText. 在这种情况下,如何使用用户在框中输入的数据更新视图模型?我当然不想劫持编辑文本的文本更改事件并逐个字符处理。这对我来说似乎是不必要的黑客攻击。


这整件事让我重新思考我处理更新以从视图中查看模型的实时数据的方式。如果我正在做的事情(2 路数据绑定)不是一个好的做法,请建议我如何处理视图接收 UI 事件导致更新视图本身当前呈现的数据的情况。