就像标题中一样,我必须打开
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()
}