Как централизовать обработку и навигацию HTTP-ответов в Android-приложении Kotlin MVVM с несколькими фрагментами?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как централизовать обработку и навигацию HTTP-ответов в Android-приложении Kotlin MVVM с несколькими фрагментами?

Сообщение Anonymous »

Предположим, у нас есть приложение Android-Kotlin с одним действием, где каждый экран представляет собой фрагмент, реализованный с использованием шаблона MVVM. Приложение имеет следующие уровни:
  • Просмотр: Фрагменты
  • ViewModel : находится между фрагментами (представлением) и репозиториями уровня модели.
  • Модель: состоит из источников данных и репозиториев, которые взаимодействуют с данными. источники.
В Уровень репозитория, у меня есть такая функция apiCall:
inline fun apiCall(crossinline apiCall: suspend () -> Response) = flow {
emit(State.Progress(0))
val response = apiCall()
val responseBody = response.body()
if (response.isSuccessful && responseBody != null)
emit(State.Success(responseBody))
else
emit(State.Error(HttpException(response)))
}.catch {
emit(State.Error(it))
}.flowOn(Dispatchers.IO)

Эта функция используется, например, в репозиториях:
fun checkOtpCode(phoneNumber: String, code: String) =
apiCall { remoteDataSource.checkOtp(phoneNumber,code) }

В функции apiCall мне нужно сообщить слою представления, что если код ответа находится в диапазоне 5xx, приложение должно перейти к фрагменту ошибки сервера, или если это 401 или 403 кода состояния, он должен перейти к фрагменту входа в систему, не повторяя логику навигации и проверки кода состояния во всех фрагментах, сохраняя при этом архитектурный шаблон MVVM и не делая код таким уродливым.
Кто-то предложил создать глобальный SharedFlow и собрать его в MainActivity. Например, если код состояния находится в диапазоне 5xx, будет вызываться globalFlow.emit(NavDest.ServerError), а глобальная навигация будет обрабатываться в MainActivity.
Но я' Мне не очень нравится это решение:
object SharedEventBus {
private val _globalEvent = MutableSharedFlow()
val globalEvent: SharedFlow = _globalEvent

suspend fun sendEvent(event: Event) {
_globalEvent.emit(event)
}

sealed class Event {
object NavigateToLogin : Event()
object NavigateToServerError : Event()
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... vm-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»