更新 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
警告,但在你的 packagesLiveData
、tvRepository.getUserPackage(string).asLiveData()
returns 和 LiveData
中你又在它周围使用了 livedata
包装器。你需要做的是这样的:
private fun packagesLiveData(string: String): LiveData<List<Packages>> {
Log.d(TAG, "switchMap: $string")
return tvRepository
.getUserPackage(string)
.asLiveData()
}
如标题,我有_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
警告,但在你的 packagesLiveData
、tvRepository.getUserPackage(string).asLiveData()
returns 和 LiveData
中你又在它周围使用了 livedata
包装器。你需要做的是这样的:
private fun packagesLiveData(string: String): LiveData<List<Packages>> {
Log.d(TAG, "switchMap: $string")
return tvRepository
.getUserPackage(string)
.asLiveData()
}