【问题标题】:After updating LiveData my switchMap don't want to trigger更新 LiveData 后,我的 switchMap 不想触发
【发布时间】:2021-07-20 10:38:27
【问题描述】:

和标题一样,我有 _token

private val _token = MutableLiveData<String>()

应该更新

val userPackages: LiveData<List<Packages>> = Transformations.switchMap(_token) {
        packagesLiveData(it)
    }

使用后

fun setToken(token: String) {
        Log.d(TAG, "setToken: $token")
        _token.postValue(token)
    }

从这个 Log.D 我知道我得到了有效的字符串 我试过了

_token.value = token

但没有任何改变 我从这个函数中看到我在 switchmap 中调用

private fun packagesLiveData(string: String): LiveData<List<Packages>> {
        Log.d(TAG, "switchMap: $string")
        return liveData {
            tvRepository
                .getUserPackage(string)
                .asLiveData()
        }
    }

我没有得到任何改变(因为这个函数根本没有被调用) 或者,如果我将 _token 的值初始化为任何字符串,那么我会看到它被调用了两次,但使用的是这个初始化值,而不是我在测试时确认的 _token.value 中的值确实在改变,但 switchmap 永远无法访问

编辑

看起来我只是没有观察到我的 liveData 但现在当我尝试这样做时,我收到了错误,我没有这个 val 的 get 函数 我正在从这个片段中获取我的模型

private val tvViewModel: TvViewModel by viewModels()

这就是我的观察者的样子

tvViewModel.userPackages.observe(viewLifecycleOwner, {
            Log.d(TAG, "setTvObservers: ${it?.get(0)}")
        })

请求的视图模型:

@HiltViewModel
class TvViewModel @Inject constructor(
    private val tvRepository: TVRepository
) :
    ViewModel() {
    companion object {
        const val TAG = "TvViewModel"
    }

    private val _tvPath = MutableLiveData<String>()
    private val _token = MutableLiveData<String>()
    val tvPath: LiveData<String> = _tvPath

    val userPackages: LiveData<List<Packages>> = Transformations.switchMap(_token) {
        packagesLiveData(it)
    }

    fun setTvPath(path: String) {
        _tvPath.postValue(path)
    }

    fun setToken(token: String) {
        Log.d(TAG, "setToken: $token")
        _token.postValue(token)
    }

    private fun packagesLiveData(string: String): LiveData<List<Packages>> {
        Log.d(TAG, "switchMap: $string")
        return liveData(Dispatchers.IO) {
            tvRepository
                .getUserPackage(string)
                .asLiveData()
        }
    }
}

【问题讨论】:

    标签: android kotlin android-livedata mutablelivedata


    【解决方案1】:

    你是observing这个LiveData,即userPackages吗?

    因为提到here

    除非观察者正在观察返回的 LiveData 对象,否则不会计算转换。

    因此,请确保您在某处观察 userPackages,如果它仍然不起作用,请告诉我们,我们将尝试再次找到解决方案 :)

    编辑:

    通过查看您使用viewLifecycleOwner 观察LiveData 的方式,您似乎是在fragment 内观察它。因此,在fragment 中,您不会通过调用by viewModels() 获得ViewModel。相反,您需要使用by activityViewModels&lt;TvViewModel&gt;

    如果还是不行请告诉我,我们再试试看:)

    最新更新

    好的,所以即使这没有给出任何compile-time 警告,但在你的packagesLiveData 中,tvRepository.getUserPackage(string).asLiveData() 返回一个LiveData,并且你在它周围再次使用livedata 包装器。你需要做的是这样的:

    private fun packagesLiveData(string: String): LiveData<List<Packages>> {
        Log.d(TAG, "switchMap: $string")
    
        return tvRepository
                .getUserPackage(string)
                .asLiveData()
    }
    

    【讨论】:

    • 请编辑您的问题并为您的ViewModel 添加代码 :)
    • 这是我的视图模型,我提供的所有内容都在我的视图模型中,这几乎就是全部 No virtual method getUserPackages()Landroidx/lifecycle/MediatorLiveData; in class Lpl/beskidmedia/bm/tv/model/TvViewModel; or its super classes (declaration of 'pl.beskidmedia.bm.tv.model.TvViewModel' appears in /data/data/pl.beskidmedia.bm/code_cache/.overlay/base.apk/classes15.dex) 现在当我为此注册观察者时,我得到了这个错误
    • 您的ViewModel 在哪里?您可以编辑您的问题并为其添加代码吗? :)
    • 我编辑了我的问题,现在你可以看到整个视图模型
    • 好的,现在没有错误但是仍然没有调用 switchmap
    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多