0

我有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为两个不同的 LiveDatas1.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))
      }
    }
  }
}

4

1 回答 1

0

在 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)
             }
          }
        }
      }
于 2019-07-23T08:35:38.570 回答