android - LiveData 不会将类型推断为所需的返回值

标签 android firebase kotlin mvvm android-livedata

我已经拨通了emit()在我的 viewModel 中,但我不知道为什么我的 LiveDataScope返回 Resource<Any>当我定义了 Resource类型为 Artist

View 模型

class EventsViewModel(private val useCase: Events):ViewModel() {

    val fetchArtistList = liveData(Dispatchers.IO){

        try {
            val artistList = useCase.getEvents()
            emit(artistList)

        }catch (e:Exception){
            Crashlytics.logException(e.cause)
            emit(Resource.error("Error: ",e.message))
        }

    }
}

用例

class EventsImpl(private val eventsRepo:EventsRepo): Events {

    override suspend fun getEvents(): Resource<MutableList<Artist>> = eventsRepo.getEventsDB()
}

repo

class EventsRepoImpl : EventsRepo {

    override suspend fun getEventsDB(): Resource<MutableList<Artist>> {
        val artistList = mutableListOf<Artist>()
        val resultList = FirebaseFirestore.getInstance()
            .collection("events")
            .get().await()

        for (document in resultList) {
            val photoUrl = document.getString("photoUrl")
            val artistName = document.getString("artistName")
            val place = document.getString("place")
            val time = document.getString("time")
            val day = document.getLong("day")
            artistList.add(Artist(photoUrl!!, artistName!!, time!!, place!!, day!!))
        }

        return Resource.success(artistList)
    }
}

但出于某种原因,而不是使用 Resource<MutableList<Artist>> 来推断类型在我的 View 模型中,它提供了一个 Resource<Any>到 LiveData:

enter image description here

我在另一个类中实现了相同的方法,但 livedata 返回正常,我尝试清除缓存并重新启动、清理和重建,但它一直返回相同

为什么不能正确推断类型?

最佳答案

推断正确。您的代码向 Kotlin 建议 LiveData 可以产生两种不同类型的对象。你有这个:

emit(artistList)

还有这个:

emit(Resource.error("Error: ",e.message))

Kotlin 可以从中推断出的最具体的常见类型是 Resource<Any> ,因为它们都是 Resource 对象,但具有不同的通用类型。

考虑发出一个带有两个子类的密封类,一个用于数据类型,另一个用于错误类型。

关于android - LiveData 不会将类型推断为所需的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59430365/

相关文章:

android - react native - "undefined is not an object react native evaluating this.props.navigation"

javascript - AngularJS “Wire up a Backend” 应用程序未在编辑对话框中加载数据 - 使用最新的 firebase

angular - 如何在 Angularfire2 Angular2 中对 FirebaseListObservable 列表进行排序?

java - 短信广播接收器不工作

java - 将编码的 UTF-8 字符转换为 android 中的特殊重音字符

java - 使用导航组件来回导航时 ViewPager 的内容消失

android - 从 Fabric 切换到 Firebase Crashlytics 问题 : The Crashlytics build ID is missing

java - 如何检查 recyclerView 是否为空 Espresso

android - 您可以嵌套 “Onclicklisteners”来运行多个 Activity 吗?

android - Dagger 2 注入(inject)多个接口(interface)和实现类