Как я могу преобразовать LiveData в 2 части liveData?

У меня configLiveData:LiveData<Response<ConfigFile>> где ответ

sealed class Response<out T> {
  data class Success<out T>(val data: T) : Response<T>()
  data class Failure<out T>(val message: String) : Response<T>()
}

теперь в ViewModel я хочу преобразовать configLiveData в два разных LiveDatas 1.LiveData<ConfigFile> и 2. LiveData<String>, и в результате преобразования один из них будет пустым. но я хочу прокатиться на LiveData<Response<ConfigFile>> и вместо него LiveData<ConfigFile>

 override suspend fun fetchConfigFile(): Response<ConfigFile> {
    return suspendCoroutine { cont ->
      EnigmaRiverContext.getHttpHandler().doHttp(AppConstants.getPath().append("config/appConfig.json").toURL(),
          JsonHttpCall("GET"), object : JsonReaderResponseHandler() {
        override fun onSuccess(jsonReader: JsonReader) {
          try {
            val successObject = ApiConfigFile(jsonReader)
            cont.resume(Response.Success(successObject.toPresenterModel()))
          } catch (e: IOException) {
            cont.resume(Response.Failure(e.message))
          } catch (e: Exception) {
            cont.resume(Response.Failure(e.message ))
          }
        }

        override fun onError(error: Error?) {
          cont.resume(Response.Failure("error.message"))
        }
      })
    }
  }

It is how my Repository looks like 

  private fun fetchConfig() {
    uiScope.launch {
      when (val result = homeRepository.fetchConfigFile()) {
        is Response.Success<ConfigFile> -> {
          postValue(Response.Success(result.data))
        }
        is Response.Failure -> postValue(Response.Failure(result.message))
      }
    }
  }


class ConfigFileLiveData @Inject constructor(val homeRepository: IHomeRepository) : LiveData<Response<ConfigFile>>() {
  private val liveDataJob = Job()
  private val uiScope = CoroutineScope(Dispatchers.Main + liveDataJob)

  override fun onActive() {
    fetchConfig()
  }

  private fun fetchConfig() {
    viewModelScope.launch {
      when (val result = homeRepository.fetchConfigFile()) {
        is Response.Success<ConfigFile> -> {
          postValue(Response.Success(result.data))
        }
        is Response.Failure -> postValue(Response.Failure(result.message))
      }
    }
  }
}

I have `ConfigFileLiveData` which is singleton and I want to use this liveData in other viewModels as I need to fetch config once and use it in different ViewModels


class ConfigFileLiveData @Inject constructor(val homeRepository: IHomeRepository) : LiveData<Response<ConfigFile>>() {

  override fun onActive() {
    fetchConfig()
  }

  private fun fetchConfig() {
    viewModelScope.launch {
      when (val result = homeRepository.fetchConfigFile()) {
        is Response.Success<ConfigFile> -> {
          postValue(Response.Success(result.data))
        }
        is Response.Failure -> postValue(Response.Failure(result.message))
      }
    }
  }
}


person I.S    schedule 23.07.2019    source источник
comment
из сети вы получаете ответ?   -  person Rajnish suryavanshi    schedule 23.07.2019


Ответы (1)


В Viewmodel определите две переменные LiveData.

private var configLiveData = MutableLiveData<ConfigFile>()
private var stringLiveData = MutableLiveData<String>()

Измените этот метод

  private fun fetchConfig() {
        uiScope.launch {
          when (val result = homeRepository.fetchConfigFile()) {
            is Response.Success<ConfigFile> -> {
              configLiveData.value = Response.Success(result.data)
            }
            is Response.Failure -> {
              stringLiveData.value = Response.Failure(result.message)
             }
          }
        }
      }
person Rajnish suryavanshi    schedule 23.07.2019
comment
Я обновил свой пост, да, я согласен, что это решение, но в вашем решении вы напрямую используете метод репозитория, в то время как я хочу использовать ConfigFileLiveData (который я обновил), поскольку ConfigFileLiveData является одноэлементным, и мне не нужно получать его везде - person I.S; 23.07.2019