【问题标题】:LiveData value is null after setting in viewModelScope在 viewModelScope 中设置后 LiveData 值为 null
【发布时间】:2019-12-30 17:17:20
【问题描述】:

我有一个带有搜索功能的片段的视图模型。我使用协程从 API 中获取数据,然后使用结果设置 MediatorLiveData 值,尽管对象列表反映在我的 RecyclerView 上。当我尝试使用liveData.value 访问 MediatorLiveData 值时,它返回 null。我试过调试它,但尽管显示了对象列表,但我无法真正访问 ViewModel 中 livedata 的值

视图模型

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)

我的代码如上所示,我已经被困了好几天了,非常感谢任何帮助! }

【问题讨论】:

  • 你试过用'post'设置值而不是用值设置吗?
  • 是的,结果相同。我认为值没问题,因为我在 viewmodelscope 中
  • 添加您的Activity/Fragment 代码,从那里您可以访问LiveData
  • @Md.Asaduzzaman 抱歉回复晚了,我在片段中只有 1 个观察者用于使用 users livedata 填充 recyclerview,我可以填充 recyclerview,我只是不知道为什么我无法访问users_users 的值

标签: android android-livedata android-architecture-components kotlin-coroutines android-architecture-lifecycle


【解决方案1】:

显然这个问题是由我的适配器中注入ViewModel 引起的。我用匕首将我的视图模型注入到我的适配器中,并使用函数selectUser() 设置按钮的onClickListener。我将clickListener 的设置提取到我的片段中并且它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多