更新 LiveData 后我的 switchMap 不想触发

After updating LiveData my switchMap don't want to trigger

如标题,我有_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()
        }
    }
}

你是observing这个LiveData,即userPackages某处吗?

因为如前所述here,

The transformations aren't calculated unless an observer is observing the returned LiveData object.

所以请确保您在某个地方观察 userPackages,如果它仍然不起作用请告诉我们,我们会再次尝试找到解决方案:)

编辑:

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

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

最新更新

好的,所以即使这不会给出任何 compile-time 警告,但在你的 packagesLiveDatatvRepository.getUserPackage(string).asLiveData() returns 和 LiveData 中你又在它周围使用了 livedata 包装器。你需要做的是这样的:

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

    return tvRepository
            .getUserPackage(string)
            .asLiveData()
}