Отложенная инициализация ответа модифицированного API в Android

#android #kotlin #retrofit2 #kotlin-coroutines #lazy-initialization

#Android #котлин #retrofit2 #kotlin-сопрограммы #отложенная инициализация #kotlin

Вопрос:

Привет, друзья, вот мой код, он является частью моего ProfileViewModel , он используется двумя фрагментами, я хочу получить значение, когда оно полезно, потому что я использую эту ViewModel для двух фрагментов. итак, я не хочу инициализировать, когда не использую его, как я могу заархивировать его с помощью отложенной инициализации, здесь ответ — это ответ, возвращаемый модифицированным, здесь сопрограмма, запущенная в диспетчерах.Ввод-вывод, и ответ анализируется моей функцией makeApiCall , он может обрабатывать успех и ошибку с помощью закрытого класса Result , поэтому он вернет ответ, если он будет успешным, иначе null, ответ также можно наблюдать в соответствующем фрагменте с соответствующей функцией, ниже приведен мой код

 val profile: ProfileModel  by lazy {  getProfile() }

init {
    getProfile()
}

fun getProfile() {
    Coroutines.io {
        makeApiCall(
            ProfileFragment.REQUEST_CODE_PROFILE
        ){
            repository.getProfile()
        }?.let { response ->
            form.name.postValue(
                response.profile.name
            )
            profile = response.profile
        }
    }
}
  

Комментарии:

1. Если вы хотите этого, почему бы просто не позвонить getProfile() , когда вам это нужно. Не вызывайте его в init блоке. Также не делегируйте свойство. Просто инициализируйте его или оставьте его нулевым. Вам должен потребоваться a LiveData для получения обратного вызова состояния загрузки.

2. я получил это из множества поисковых запросов в interner, наконец, обнаружил, что fun <T>lazyDeferred(блок: приостановить сопрограммирование.() -> T) : Lazy<Отложенный<T>>{ вернуть lazy { GlobalScope.async(start = CoroutineStart.LAZY){ block.invoke(this) } }} и теперь в моем коде val profile с помощью lazyDeferred { makeApiCall( ProfileFragment. REQUEST_CODE_PROFILE ){ repository.getProfile() }?.profile } и в моих сопрограммах фрагментов. main { binding.profile = ViewModel.profile. await() } спасибо @ADM