在 viewModelScope 中设置后 LiveData 值为 null
LiveData value is null after setting in viewModelScope
-
android
-
android-livedata
-
android-architecture-lifecycle
-
android-architecture-components
-
kotlin-coroutines
我有一个具有搜索功能的片段视图模型。我使用协程从 API 中获取数据,然后使用结果设置 MediatorLiveData 值,尽管对象列表反映在我的 RecyclerView 上。当我尝试使用 liveData.value
访问 MediatorLiveData 值时,它 returns 为空。我试过调试它,但尽管显示了对象列表,但我无法真正访问 ViewModel
中实时数据的值
视图模型
class SearchViewModel @Inject constructor(private val mutwitsRepo: MutwitsRepo) : BaseViewModel() {
val query = MutableLiveData<String>()
private val _isLoading = MutableLiveData<Boolean>()
val isLoading: LiveData<Boolean> = _isLoading
private val _users = MediatorLiveData<List<User>>()
val users: LiveData<List<User>> = _users
private var queryTextChangedJob: Job? = null
init {
_users.addSource(query) { queryStr ->
if (queryStr.isNullOrEmpty()) _users.value = emptyList()
else searchUsers(queryStr)
}
}
fun searchUsers(query: String) {
_isLoading.value = true
queryTextChangedJob?.cancel()
queryTextChangedJob = viewModelScope.launch {
delay(300)
_users.value = mutwitsRepo.searchUsers(query)
_isLoading.value = false
}
}
fun selectUser(user: User) {
val temp = _users.value
temp?.find { it.id_str == user.id_str }?.toggleSelected()
_users.value = temp
}
override fun onCleared() {
super.onCleared()
queryTextChangedJob?.cancel()
}
}
存储库功能
suspend fun searchUsers(query: String): List<User> = withContext(Dispatchers.IO) {
return@withContext twitterService.searchUsers(query)
我的代码如上所示,我已经被困了好几天了,非常感谢任何帮助!
}
显然这个问题是由在我的适配器中注入 ViewModel
引起的。我用匕首在我的适配器中注入了我的视图模型,并使用函数 selectUser()
设置了按钮的 onClickListener
。我将 clickListener
的设置提取到我的片段中并且它起作用了。
android
android-livedata
android-architecture-lifecycle
android-architecture-components
kotlin-coroutines
我有一个具有搜索功能的片段视图模型。我使用协程从 API 中获取数据,然后使用结果设置 MediatorLiveData 值,尽管对象列表反映在我的 RecyclerView 上。当我尝试使用 liveData.value
访问 MediatorLiveData 值时,它 returns 为空。我试过调试它,但尽管显示了对象列表,但我无法真正访问 ViewModel
视图模型
class SearchViewModel @Inject constructor(private val mutwitsRepo: MutwitsRepo) : BaseViewModel() {
val query = MutableLiveData<String>()
private val _isLoading = MutableLiveData<Boolean>()
val isLoading: LiveData<Boolean> = _isLoading
private val _users = MediatorLiveData<List<User>>()
val users: LiveData<List<User>> = _users
private var queryTextChangedJob: Job? = null
init {
_users.addSource(query) { queryStr ->
if (queryStr.isNullOrEmpty()) _users.value = emptyList()
else searchUsers(queryStr)
}
}
fun searchUsers(query: String) {
_isLoading.value = true
queryTextChangedJob?.cancel()
queryTextChangedJob = viewModelScope.launch {
delay(300)
_users.value = mutwitsRepo.searchUsers(query)
_isLoading.value = false
}
}
fun selectUser(user: User) {
val temp = _users.value
temp?.find { it.id_str == user.id_str }?.toggleSelected()
_users.value = temp
}
override fun onCleared() {
super.onCleared()
queryTextChangedJob?.cancel()
}
}
存储库功能
suspend fun searchUsers(query: String): List<User> = withContext(Dispatchers.IO) {
return@withContext twitterService.searchUsers(query)
我的代码如上所示,我已经被困了好几天了,非常感谢任何帮助! }
显然这个问题是由在我的适配器中注入 ViewModel
引起的。我用匕首在我的适配器中注入了我的视图模型,并使用函数 selectUser()
设置了按钮的 onClickListener
。我将 clickListener
的设置提取到我的片段中并且它起作用了。