- Просмотр: Фрагменты
- ViewModel : находится между фрагментами (представлением) и репозиториями уровня модели.
- Модель: состоит из источников данных и репозиториев, которые взаимодействуют с данными. источники.
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
Мобильная версия