鉴于以下设置:
我有 2 个存储库:Repository A 和 Repository B 它们都返回实时数据。
我有一个使用这两个存储库的 ViewModel。
我想从存储库 A 中提取一些东西,根据结果我想从存储库 B 中获取一些东西,然后在返回 UI 之前转换结果。
为此,我一直在查看 LiveData Transformation类。这些示例显示了结果的单个转换,但是我想要一些类似于链接两个转换的东西。我怎样才能做到这一点?
我尝试过这样设置,但在第二个转换 block 上出现类型不匹配:
internal val launchStatus: LiveData<String> = Transformations
.map(respositoryA.getData(), { data ->
if (data.isValid){
"stringA"
} else {
//This gives a type mismatch for the entire block
Transformations.map(repositoryB.getData(), {
result -> result.toString()
})
}
})
(另外请告诉我是否有替代/推荐的方法来获取链接这些调用的内容,即从 A 获取一些内容,然后根据 A 的结果从 B 获取一些内容等等)
最佳答案
您的 lambda 有时会返回 String
"stringA"
, 有时返回 LiveData<String>
给出:
Transformations.map(repositoryB.getData(), {
result -> result.toString()
})
这意味着您的 lambda 没有意义 - 它在不同的分支中返回不同的东西。
正如其他人所提到的,您可以编写自己的MediatorLiveData
而不是使用 Transformations
给出的那个.但是,我认为执行以下操作更容易:
internal val launchStatus: LiveData<String> = Transformations
.switchMap(respositoryA.getData(), { data ->
if (data.isValid) {
MutableLiveData().apply { setValue("stringA") }
} else {
Transformations.map(repositoryB.getData(), {
result -> result.toString()
})
}
})
我所做的只是让第一个代码分支也返回 LiveData<String>
,所以现在你的 lambda 是有意义的 - 它是 (String) -> LiveData<String>
.我必须做出另一项更改:使用 switchMap
而不是 map
.这是因为 map
需要一个 lambda (X) -> Y
, 但是 switchMap
需要一个 lambda (X) -> LiveData<Y>
.
关于android - 使用实时数据时如何在 Android 中链接转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253505/