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

android - 嵌套转换而不是合并的实时数据

我有两个 livedatas startedAt&finishedAt并希望在依赖于这两个值的转换中使用它们...我尝试使用 mediatorliveData 组合它们

并观察他们

但这并没有按预期工作,因为 finishedAt 在获得所需值之前返回 null ,

调试结果:

V/检查索引:0 1 空

V/检查索引:0 1 1

在转换中使用转换是个好主意吗?前任:

0 投票
1 回答
587 浏览

android - 转换映射中的 Android LiveData 为空

我正面临 Android LiveData 和转换地图的问题。我将解释这个案例:

我有一个 SingleLiveEvent 和 LiveData 如下(一个用于所有项目,另一个用于显示在屏幕上的项目):

在 Fragment 中,观察后itemsToDisplay,如果我试图获取itemsToDisplayLiveData( itemsToDisplay.value) 的值始终为 null

有谁知道 LiveData 是否不保存该值,如果它是使用计算的,Transformation.map或者它可能是一个潜在的错误?

0 投票
1 回答
324 浏览

android - 如何将 2 个 LiveData 字段的结果组合到另一个不同类型的 LiveData 字段中

我有一个 ViewModel 类,其中包含 2 个可以为 null 的类型的 livedata 可观察对象(例如ab),我想添加一个新的布尔可观察对象(例如c),只要两者都不为空,它就为真ab否则为假。

有人建议我使用 LiveData 转换来实现这一点,但我不太确定它是如何工作的。使用地图转换,我只能在单个观察者之间转换,但不能添加多个源。

然后这导致我将表示c作为 MediatorLiveData 并添加ab作为源,但这依赖于它们都是相同类型的事实,所以我不确定我是否可以使用它。

实现此目的的惯用方法是什么?

0 投票
1 回答
1998 浏览

kotlin - LiveData 转换映射功能

最近我一直在学习 LiveData 上的转换方法

我知道我们可以使用maporswitchMap方法来转换 livedata。假设我们有类似下面的 Player 数据类

我们使用 map 方法将玩家 livedata 转换为 playerName livedata

我的问题是,在观察者函数中这样做有什么区别,因为它们都在主线程中运行?我的意思是,如果我们想获得 playerName,那么我们也可以在观察者函数中获得它。为什么我们声明第二个 LiveData 实例来获得它

我从本指南中获取了示例代码:https ://proandroiddev.com/livedata-transformations-4f120ac046fc

0 投票
0 回答
62 浏览

java - Java 泛型导致编译错误“无法推断类型”/Android LiveData 转换

我对 Java 泛型/模板参数和类型推断有疑问。特别是,我收到一个我不理解的编译错误(问题 3)。该代码使用 Android API。因此,有关 Android API 的一些背景知识可能有助于读者理解问题。我使用 Java 7。

我的存储库类:

为了在未来的版本中提供稳定的接口, 的接口MyRepository应仅公开LiveData包含 a的接口List,但不应公开List由 实际实现的接口ArrayList

问题一:为什么接口声明public LiveData<List<MyEntity>> getEntitiesByID( long id )会导致“类型不兼容”?为什么我必须使用那种复杂的? extends List<MyEntity>结构?

MutableLiveData可以向上转换为LiveDataArrayList可以向上转换为List. 在这两种情况下,“is-an”关系都得到了满足。

我的视图模型类:

问题 2:为什么我必须在它? extends List<MyEntity>的定义中的任何地方都使用结构Function<Long, LiveData<? extends List<MyEntity>>> ...,如果可以简单地写成List<MyEntity>. (可能与问题 1 相同的问题/解释。)

编译失败并Transformations.switchMap( liveID, switchMap )出现错误

问题3:我该如何解决这个问题?恕我直言,类型应该匹配。

虽然我会理解问题 1 和 2 可能是 Java 语言的固有限制,但我没有看到问题 3。特别是,我尝试了其他几种变体,但都没有奏效。似乎我不了解泛型/模板参数在 Java 中的基本工作原理。我是一个相当优秀的 C++17/20 程序员,并且在模板参数方面从来没有遇到过问题,但是 Java 让我发疯了。

0 投票
0 回答
42 浏览

android - 在 Android 中将多个 LiveData 对象聚合为一个 LiveData 聚合对象

在我的 Android 应用程序中,我需要将 LiveData 对象列表聚合到这些对象的单个 LiveData 列表中,
简而言之:List<LiveData<T>> ====aggregate===> LiveData<List<T>>.

我坚持使用MediatorLiveData(参见下文)的方法,并想知道是否有任何开箱即用的解决方案或针对我的问题的既定模式。

领域模型

  1. 域类是UserProduct
  2. 用户有一个最喜欢的产品列表,并且可以在他们的收藏夹中添加或删除产品

功能要求

  1. 作为一个活动,在列表中显示用户的收藏夹。用户可以从收藏活动的列表中删除产品。
  2. 有一个显示单个选定产品的活动。产品活动知道产品是否在给定用户的收藏夹中。在产品活动中,用户可以将产品添加到收藏夹或从收藏夹中删除产品
  3. 对收藏列表的更改必须反映在所有其他活动中,例如,如果用户在产品活动中将产品添加到收藏并导航到收藏活动,则该产品必须出现在收藏活动中

技术要求

  1. Java中的代码库
  2. 使用 Android 的 LiveData API 传播状态。RxJava 不是一个选项

我的方法

我设法编写了一个方法,该方法getFavoriteIds$(...)返回一个LiveData<List<String>>特定用户最喜欢的产品的 id,以及一个getProduct$(...)从远程 API 获取单个产品的产品数据并返回一个LiveData<Product>

我的目标是编写一个getFavorites$(...)将用户 ID 作为输入并返回LiveData<List<Product>>包含该用户产品完整列表的方法。

我的方法的问题在于它会mediator$更新每个产品的值,但我只想更改一次,在所有产品都从远程 API 获取之后。挑战在于区分事件(用户添加了产品)和事件(产品数据已完成从远程 API 加载)。

0 投票
0 回答
41 浏览

android - 映射的 LiveData 在 getValue() 调用上返回 null

我正在我的项目中构建一个视图模型,并且我编写了一个这样的 LiveData 集

我面临的问题是,当我在 Fragment/Activity 中观察“id”时,我可以从“id”LiveData 接收更新,但是如果我尝试通过“id.value”从“id”获取当前值,它甚至返回 null如果“_user”liveData 已更新。

有什么理由吗?我错过了什么吗?

0 投票
0 回答
37 浏览

kotlin - 如何使用 Android Livedata 将可为空的源类型传递给 Transformations.map?

如何将可为空的源类型传递给Transformations.mapAndroid Livedata?该类RoomDatabase正在返回一个可以为空的实例RoomDatabase。随后调用Dao返回 LiveData 对象的查询函数本身可以为空。当我Transformations.map在这个可为空的 LiveData 类型上使用时,它会抛出一个错误,指出它需要一个不可为空的数据类型。我怎样才能做到这一点?

错误:

注意:在源类型上应用双键运算符会使错误消息消失,但如果源在运行时实际上为空,我担心这会引发异常并使应用程序崩溃。

0 投票
2 回答
55 浏览

android - 为什么每个活动都更新到原始实时数据而不是最近的实时数据?

会议视图模型

有一个使用 kotlin 的对象声明的单例存储库。存储库有一个 BaseActivity 正在观察的实时数据。

存储库

基本活动

前台服务会更改相应可变实时数据的值。BaseActivity 收到更新,我们正在显示小吃栏。现在,当我们更改活动时,即使它不是由前台服务触发,也会再次触发相同的结果。

例如,如果我们在activity A (that extends the BaseActivity)并且前台服务将新参加者总数的值更改为 5,我们将在 5 个用户已加入会议中activity A显示。用户在activity A. 一段时间后,当用户移动到 时activity B (that is also extending BaseActivity),前台服务没有任何响应,activity B接收到的最新更新与活动 A 收到的相同,因此,活动 B 还显示 5 个用户已加入会议的小吃栏,这种模式将持续所有的活动。

会议视图模型

服务

每当前台服务更改相应的可变实时数据时,新活动(在我们的示例中为活动 B)应仅在新数据 (5) 发生更改时才获得更新,因为meetingViewModel.observeAttendeesJoined()仅返回新数据。

如何在活动中接收独特的更新?

每个活动的实例MeetingViewModel都不同,但存储库数据是单例(kotlin 的对象声明),不是吗?

我试图理解Transformations.mapswitchMap但不知道如何使用它来解决问题。

谢谢你的期待。

0 投票
1 回答
169 浏览

android - 使用 Transformations.map 而不是 observeForever

我正在做我的第一次实习,我正在一个项目中将 RX 代码转换为 LiveData。在某些时候,我不得不在某些存储库中用 observeForever() + Globalscope(Dispatchers.Main) 替换 subscribe() 函数,但显然使用 observeForever() 并不是最好的做法,我的实习导师建议我使用 Transformations.map () 反而 。

我不确定如何在以下代码(在存储库中)中使用 map() 而不是 observeForever:

我从 Transformations.map() 函数中了解到的是,它用于映射给定 LiveData 对象的值,就像ReactiveX的Map 运算符一样

我试过了,但似乎没有做我想做的事:

我的问题是我应该如何使用 Transformation.map() 来避免 observeForever ?

做某事:如果你需要一个例子,可能是一个 livedataObject.postValue(it)

提前感谢您的回复。