更新实时数据后,我的开关地图不想触发



就像标题中一样,我必须打开

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)
}

从该日志。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中的值。我在测试时确认的值确实在变化,但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

因为如前所述,

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

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

编辑:

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

如果它仍然不起作用,请告诉我,我们会再次尝试:(

最新更新

好吧,尽管这不会给出任何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()
}