将LiveData <Resource <User >>转换为LiveData <User>时出现类型干扰问题

时间:2019-09-21 18:42:01

标签: android kotlin type-inference android-databinding android-livedata

我正在尝试将Android Architecture GitHub example与数据绑定结合在一起。为此,我认为我必须在UserViewModel中添加从LiveData>到LiveData的附加转换:

val userResourceLiveData: LiveData<Resource<User>> = Transformations.switchMap(_login) { login ->
    if (login == null) {
        AbsentLiveData.create()
    }
    else {
        repository.loadUser(login)
    }
}

val userLiveData: LiveData<User> = Transformations.switchMap(userResourceLiveData) { userResource ->
    if (userResource == null) { // Error 1 on 'if'
        AbsentLiveData.create() // Error 2 on 'create()'
    }
    else {
        MutableLiveData(userResource.data)
    }
}

但是,出现两个错误:

  

1)控制流表达式的类型推断失败,请明确指定其类型。

     

2)类型推断失败:没有足够的信息来推断有趣的create()中的参数T:LiveData

如果我将代码更改为此:

if (userResource == null) {
   AbsentLiveData.create<User>()
}

然后switchMap开始抱怨:

  

类型推断失败:无法在...中推断类型参数Y

1)为什么这样不起作用?我没想到根本不需要类型定义,因为<LiveData<Resource<User>>>的映射以相同的方式正常工作。

2)如何解决错误?

3)可能将这种解决方案应用于数据绑定是一种错误的方法吗?

The commit with this specific issue on GitHub repo

1 个答案:

答案 0 :(得分:1)

这对我有用:

        if (userResource == null) {
            AbsentLiveData.create<User>()
        }
        else {
            MutableLiveData(userResource.data!!)
        }