【问题标题】:Type interference issue when Transforming LiveData<Resource<User>> to LiveData<User>将 LiveData<Resource<User>> 转换为 LiveData<User> 时的类型干扰问题
【发布时间】: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) 为什么这不一样?我根本没想到需要类型定义,因为 &lt;LiveData&lt;Resource&lt;User&gt;&gt;&gt; 的映射以相同的方式正常工作。

2) 如何解决错误?

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

The commit with this specific issue on GitHub repo

【问题讨论】:

  • userResource.data 是类型User?
  • 我想说的是因为userResource.data的类型是User?,它返回LiveData&lt;User?&gt;所以它可能与方法签名不匹配。您是否尝试过类似MutableLiveData(userResource.data!!) 的操作?
  • 你是对的,它是User?,但是,我没有看到该行有任何错误。将其更改为 MutableLiveData(userResource.data!!) 不会改变任何事情。我在 cmets 中指出的地方只有错误。如果您需要更多信息,可以分叉我的仓库。
  • 如果我遗漏了完整的 if-else 语句,那么我确实需要将其定义为 MutableLiveData(userResource.data!!)。但是,该应用程序立即在该行崩溃,因为 userResource.data == null 最初!

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


【解决方案1】:

这对我有用:

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

【讨论】:

  • 我自己刚刚找到了一个不同的解决方案:if (userResource?.data == null) { AbsentLiveData.create&lt;User&gt;() } else { MutableLiveData(userResource.data) } 我认为与强制!! 相比,它更安全。我注意到了这一点,因为与 userResourceLiveData 映射相比,if 语句是唯一的区别。仍然。感谢您的 cmets,我找到了解决方案,所以我会接受您的回答 ;-) 不过,我认为该错误具有误导性(至少在我将 &lt;User&gt; 添加到 create() 之后,后者具有误导性)!
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多