【发布时间】:2020-01-22 09:12:20
【问题描述】:
我正在尝试将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)
}
}
但是,出现了 2 个错误:
1) 控制流表达式的类型推断失败,请明确指定其类型。
2) 类型推断失败:没有足够的信息来推断 fun create(): LiveData 中的参数 T
如果我把代码改成这样:
if (userResource == null) {
AbsentLiveData.create<User>()
}
然后switchMap 开始抱怨:
类型推断失败:无法推断类型参数 Y in ...
1) 为什么这不一样?我根本没想到需要类型定义,因为 <LiveData<Resource<User>>> 的映射以相同的方式正常工作。
2) 如何解决错误?
3) 这种应用数据绑定的解决方案可能是错误的方法吗?
【问题讨论】:
-
userResource.data是类型User? -
我想说的是因为
userResource.data的类型是User?,它返回LiveData<User?>所以它可能与方法签名不匹配。您是否尝试过类似MutableLiveData(userResource.data!!)的操作? -
你是对的,它是
User?,但是,我没有看到该行有任何错误。将其更改为MutableLiveData(userResource.data!!)不会改变任何事情。我在 cmets 中指出的地方只有错误。如果您需要更多信息,可以分叉我的仓库。 -
如果我遗漏了完整的 if-else 语句,那么我确实需要将其定义为
MutableLiveData(userResource.data!!)。但是,该应用程序立即在该行崩溃,因为userResource.data== null 最初!
标签: android kotlin type-inference android-databinding android-livedata