【问题标题】:How to convert a nullable flowable to LiveData如何将可为空的可流转换为 LiveData
【发布时间】:2019-12-17 15:51:56
【问题描述】:

在我的存储库类中,我正在调用 webservice。如果查询不为空,则返回可流动的结果,如果查询为空,则返回空。然后在我的 ViewModel 中,我将 flowable 转换为 LiveData。

下面是sn-p的代码:

在 myRepository 类中:

fun fetchToDosFromServer(fullQueryString: String?)
        : Flowable<GitResult>? 
{
    if(fullQueryString.length>0)
    { //call webservice- which return observable<GitResult>
       var returnedResult = myWebServiceCall()
        return returnedData.toFlowable(BackpressureStrategy.BUFFER)
       }

    else 
        return null

}

在 myViewModel 类中:

 fun getReposFromServer()
 {
    val resultFromApiCall_flowable : Flowable<GitResult>? =  mainRepository.fetchToDosFromServer("q=2")

    val source: LiveData<GitResult> = LiveDataReactiveStreams.fromPublisher(resultFromApiCall_flowable)
 }

但在 myViewModel 类中尝试将 flowable 转换为 LiveData 时显示编译时错误。行内:

LiveDataReactiveStreams.fromPublisher(resultFromApiCall_flowable)

错误是:

错误:需要 Flowable ,找到 Flowable?

我该如何解决?

【问题讨论】:

  • @coroutineDispatcher:不起作用
  • val resultFromApiCall_flowable : Flowable&lt;GitResult&gt;? = mainRepository.fetchToDosFromServer("q=2") 是可选的。因此,您可以使用val resultFromApiCall_flowable : Flowable&lt;GitResult&gt;! = .. 强制强制转换,或者您进行空检查。 resultFromApiCall_flowable?.let { val source: LiveData&lt;GitResult&gt; = LiveDataReactiveStreams.fromPublisher(it) }
  • @kuzdu :我使用了第二个选项并且它有效。谢谢。但是我还有另一个困惑..如果我使用if(resultFromApiCall_flowable!=null) { val source: LiveData&lt;GitResult&gt; = LiveDataReactiveStreams.fromPublisher(resultFromApiCall_flowable) },那么错误也会消失。但是和xx?.let{...}一样吗
  • 是的,但是你可以在这里更方便地处理else

标签: kotlin


【解决方案1】:

你已经得到了如何直接处理的答案,但我建议考虑不同的方向。只是不要让结果为空,而是在这种情况下返回Flowable.empty()。也许也不接受String?;在某些情况下你真的想打电话给fetchToDosFromServer(null)吗?

【讨论】:

  • 如果我返回Flowable.empty(),那么我如何检查它何时返回为空?
  • 大多数情况下你不想检查;只需将其视为任何其他返回的Flowable。如果您确实想区分这种情况,这不是一个好的解决方案。但是为什么要区别对待fetchToDosFromServer("")fetchToDosFromServer(anyInvalidQueryString)
  • 当然,这建议返回Flowable.error()或抛出异常而不是Flowable.empty()fetchToDosFromServer 对无效查询字符串所做的任何事情。
【解决方案2】:

您的流程是可选的。

因此,如果您进行空检查,它应该可以工作。

val resultFromApiCall_flowable: Flowable<GitResult>? = mainRepository.fetchToDosFromServer("q=2")

if (resultFromApiCall_flowable != null) {
 val source: LiveData<GitResult> = LiveDataReactiveStreams.fromPublisher(resultFromApiCall_flowable)
}

这是一样的

resultFromApiCall_flowable?.let { 
 val source: LiveData<GitResult> = LiveDataReactiveStreams.fromPublisher(it)
}

不管怎样,两者都可以用,但不一样。

看看这里:let vs if not null

如果您喜欢处理else 案例:

b?.let {
    // If b is not null.
} ?: run {
    // If b is null.
}

来自https://stackoverflow.com/a/46726337/4420355 by marstran

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多