android - 使用实时数据时如何在 Android 中链接转换?

标签 android kotlin android-architecture-components android-livedata

鉴于以下设置:

我有 2 个存储库:Repository ARepository 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/

相关文章:

android - Android-> iOS零配置网络发现jmDNS损坏

android - Android 应用程序根本不接收 GCM 消息

kotlin - 为什么 BiPredicate.test 方法在 Kotlin 中不可见?

Android Persistence room : "Cannot figure out how to read this field from a cursor"

android - OnItemSelectedListener.onNothingSelected 是否被调用了?

java - java.lang.String 类型无法转换为 JSONObject

java - Robolectric String.format() 格式化数字时的无效行为

android - 试图建立我自己的通知,但没有任何效果

android - 为什么私有(private)集不适用于 MutableLiveData?

android - 当应用程序处于后台时,我的 mvvm、livedata 应用程序是否应该取消网络请求?