问题标签 [android-livedata-transformations]

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 投票
1 回答
215 浏览

android - Android LiveData:作为方法或变量提供的 LiveData 之间的区别

在观察作为方法公开的 LiveData 和作为变量公开的 LiveData 之间,我面临着一个奇怪但巨大的行为差异。在您的 ViewModel 中考虑以下代码:

LiveData 作为方法

LiveData 作为变量

如您所见,唯一的区别是 carColors 是如何被外部观察到的。首先作为方法,getCarColors()然后作为公共变量carColors

在 xml 数据绑定布局中,片段和几次都观察和使用汽车颜色。

使用可变方法时,一切正常。一旦 API 调用成功,代码就会从数据库中请求汽车颜色一次。

使用方法方式时,API调用执行一次,但其上的Transformation最多调用20次!为什么它会这样?

需要明确的是:两个代码示例最终都得到了工作结果,但由于某种原因,第二个示例被执行/调用了很多次,尽管转换后的 apiCall 只更改了一次。

0 投票
0 回答
189 浏览

android - Android MediatorLiveData 值更改被调用 2 次

我在从 firebase 获取数据的函数中有一个中介实时数据对象。

这是我的功能:

在我的活动中,我正在观察我的用户中介对象:

checkIfExistingUser()当我单击我的登录按钮时调用此函数。但是在日志中我可以看到函数 decomposeDataSnapshots() 被调用了两次,我不知道为什么。请参阅下面的日志结果:

如您所见,数字 4 和 5 被调用了两次,我不知道为什么。

我是否以错误的方式使用调解器实时数据?请帮我。

0 投票
0 回答
334 浏览

android - 更改片段时Android livedata失去活跃的观察者

我有一个应用程序,它遵循一个带有几个片段的单一活动模式,这些片段使用 Jetpack 导航在抽屉​​内导航。

在一个片段上,我有一个实时数据帐户,我从我的片段中观察到:

accountFragment.kt

accountViewModel.kt

我有一个按钮,当我单击时,会触发视图模型中的单击功能。功能 click 记录帐户实时数据是否有活跃的观察者。

当我的应用程序启动时,它直接进入帐户片段。当我单击按钮时,它显示为真。但是,如果我更改抽屉中的片段并返回 accountFragment 并单击按钮,则显示为 false。你能帮忙解释一下为什么我的账户实时数据正在失去观察者吗?

我有另一个cardFragment,它以与帐户片段相同的方式获取数据,并且不会失去其活跃的观察者。我的来源来自 firebase,我可以毫无问题地从中获取数据。它也适用于 cardsFragment 并且代码与帐户片段相同。我只是在帐户片段方面遇到问题。有人可以帮帮我吗?

0 投票
1 回答
214 浏览

android - 防止在配置更改时发出 MediatorLiveData 事件

在架构示例中,有一个名为SingleLiveEvent的 MutableLiveData 扩展,它可以帮助我们防止 LiveData 在手机轮换或配置更改时触发。

这(SingleLiveEvent)避免了事件的常见问题:在配置更改(如旋转)时,如果观察者处于活动状态,则可以发出更新。

但是我们不能将 MediatorLiveData 转换为 SingleLiveEvent。我们如何避免在配置更改时发出 MediatorLiveData?

0 投票
2 回答
614 浏览

android - 在一种特定情况下未观察到 LiveData

我的 ViewModel 中有 3 个 LiveData 对象,我正在对这些对象应用转换,问题是 2 个 LiveData 被观察到,而另一个没有,我尝试了不同的解决方案,例如更改 ViewModel 的初始化方式或 LiveData 的方式已初始化,但对我没有任何帮助。

如果您注意到 LiveData b 和 c 只被初始化一次,因此我可以在 RecyclerView 中看到数据,但是对于 LiveData A,搜索文本可以根据用户输入而更改,这就是我的片段所在的位置没有观察这个实时数据。注意事项:这是我的 3 个 viewPager 片段的常见 ViewModel,在一个片段中观察到 LiveData a,在另一个片段中观察到 B,在另一个片段中观察到 C。最终,我还必须应用搜索其他 2 个片段。当我调试片段中的观察者行被跳过时,我想指出的另一件事是所有 3 个片段中的代码都是相同的,只是它们观察的是不同的 LiveData

编辑:我现在注意到的是,因为我从 Fragment D 调用 setSearchText(),所以我能够观察 Fragment D 中 LiveData A 的变化,但我想在 Fragment A 中观察它但不能。我在片段 D 中有一个搜索栏,底部有一个带有 3 个片段的视图寻呼机,所有 4 个片段都有一个共同的 viewModel,我在这里做错了什么,或者这不是实现这个的方法吗?TIA

0 投票
3 回答
576 浏览

android - 使用初始超时观察 livedata

我有一个 livedata,每次数据库中有更新时都会发出。当特定屏幕打开时,此 livedata 会立即发出数据库中的任何值。然后,进行网络调用以更新数据库。更新数据库后,livedata 再次发出。这导致非常快速的连续两次排放。对数据库的后续更新工作正常,因为每当更新数据库时只有一次发射。只有第一次,很快就连续更新了 2 次。我想避免这种情况。

避免这种情况的想法是这样的。当 livedata 发出时,等待 Xs。如果这些 X 中有另一个发射,则丢弃旧发射中的数据并使用新发射。再次等待Xs。如果这些 X 中没有排放,请使用最新数据。

这看起来与节流非常相似,但只有一次。我想知道是否有一种简单的方法可以使用 LiveData 或 MediatorLiveData。

0 投票
2 回答
403 浏览

android - 观察 Android LiveData从 ViewModel 返回 NULL

我有一个ViewModel显示transactionstransactionSummaryLiveData的句柄

transactions来自Room的返回LiveData<T>类似,transactionSummary但有一个转换过程来获取事务的摘要,如incomeexpense

下面是改造过程:

但是,当我从 Fragment 请求更新时,transactionSummary总是返回NULL

getFetchTransactionViewModel().updateTransactionSummary(selectedDateRange)

这是我里面的更新功能ViewModel

我观察到transactionSummary这样的:

是否有任何遗漏的步骤或不正确的实现?

谢谢

0 投票
2 回答
851 浏览

android - Transformations.map() 返回空值

我正在编写一个程序,其中有两个 LiveData 对象,如图所示:

问题是每当我观察到selectedImages LiveData它工作正常,但是当我观察到selectedBitmaps LiveData它返回以下错误:

我认为 Transformations.map() 返回空值。我之前在一个项目中做过类似的事情,当我使用 Transformations.map() 时也发生了同样的事情。有谁知道为什么会这样?

0 投票
0 回答
349 浏览

android - 如何根据 ViewModel 中的其他两个 LiveData 值更改 LiveData 值

我想根据其他两个 LiveData 值更改 LiveData 值,但我不知道该怎么做。

我知道我可以使用 LiveData.map() 但这仅在我想根据另一个 LiveData 值更改 LiveData 值时才有效。

我有一个包含这两个 LiveData 变量的 Repository 类:

然后,我有一个带有这个 LiveData 变量的 ViewModel:

我也可以使用:

但是,只有当 isLoadingDataFromDatabase 和 isLoadingDataFromNetwork 都为真时,我才会将 showLoadingIndicator 值更改为真。

我不能使用 observe() 方法,因为它在 ViewModel 内部使用并且没有生命周期

0 投票
0 回答
736 浏览

android-lifecycle - Android MediatorLiveData 将多个 LiveData 结果组合成单个 LiveData 对象(在 Java 中)

我使用 2 LiveDatas 从单独的表到我的应用程序的存储库中。我将这两个LiveDatas 作为源添加到CustomMediatorLiveData扩展的类中MediatorLiveData。在each 方法的onChanged回调中,我将两个s 的值发送到一个将两者结合并返回一个设置为对象的单个方法中。我在我的存储库中创建了一个对象,并将这两个s 作为构造函数的参数传递。addSourceLiveDataLiveDataLiveDatavalueCustomMediatorLiveDataCustomMediatorLiveDataLiveData

这会运行并且不会给出任何错误,但它会弄乱 LiveData 本身的数据。

示例:如果日期最初是 2020 年 8 月 15 日,那么它可能类似于 0001 年 8 月 14 日。

CustomMediatorLiveData:

注意存储库类:

我尝试使用该MediatorLiveData对象并将两个LiveData源添加到存储库本身中,但同样的问题仍然存在。

实现这一点的正确方法是什么?如何将 2 LiveDatas 组合成一个LiveData可以观察到的单个。