рдЖрдкрдХреЛ рдПрдорд╡реАрдкреА рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдмрд╛рд╣рд░ рдХреНрдпреЛрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЖрдЬ рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рд▓реЗрдЦ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрд╣рд╕рд╛рд╕ рд╣реБрдЖ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред


рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореЗрд░реА рдирдЬрд░ рдПрдорд╡реАрдкреА рдкрд░ рдкрдбрд╝реАред рдореБрдЭреЗ рд╕рд╛рджрдЧреА рдкрд╕рдВрдж рдереА рдФрд░ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рд╛рдордЧреНрд░реА рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдереАред
рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рдерд╛ред рдПрдХ рднрд╛рд╡рдирд╛ рдереА рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╕рдВрднрд╡ рд╣реИред


рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдерд╛, рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред


class MoviePresenter(private val repository: Repository) : BasePresenter<MovieView>() { fun loadMovies() { coroutineScope.launch { when (val result = repository.loadMovies()) { is Either.Left -> view?.showError() is Either.Right -> view?.showMovies(result.value) } } } } 

рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛


 interface MovieView : MvpView { fun showMovies(movies: List<Movie>) fun showError() } 

рдЖрдЗрдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:


  1. рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпреВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА рдЬреЛ рдкреИрдХреЗрдЬ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддреА рд╣реИрдВред
  2. рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╢реНрдп рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  3. рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдЧрд╛рдпрдм рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдордп рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдорд░ рд░рд╣реА рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдбреЗрдЯрд╛ рддрдм рдЖрдпрд╛ рдЬрдм рд╡реНрдпреВ рдЕрднреА рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИред рдЬрдм рдпрд╣ рджреГрд╢реНрдп рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ, рддреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдпрд╣ рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реИ? рдЙрддреНрддрд░: рдХреЗрд╡рд▓ рдмреИрд╕рд╛рдЦреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Moxy рдХреЗ рдкрд╛рд╕ рдПрдХ ViewState рд╣реИ рдЬреЛ ViewCommand рд╕реВрдЪреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЦреАрдВрдЪрдирд╛ рдЕрддрд┐рд╢реНрдпреЛрдХреНрддрд┐рдкреВрд░реНрдг рд╣реИ (рдорд▓реНрдЯреАрдбреЗрдХреНрд╕ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИред рдкреНрд▓рд╕, рдЕрд╕реЗрдВрдмрд▓реА рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛, рдЬреЛ рдЗрд╕реЗ рд▓рдВрдмрд╛ рдХрд░ рджреЗрдЧрд╛ред рд╣рд╛рдБ, рдЖрдк рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ) рд╡реГрджреНрдзрд┐рд╢реАрд▓ kapt, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рд░реНрддреЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ)ред рдкреНрд▓рд╕ рд╡реНрдпреВрдХреЛрдорд╛рдВрдб рдкрд╛рд░реНрд╕рд▓реЗрдмрд▓ рдпрд╛ рд╕реАрд░реАрдпрд▓реЗрдмрд▓ рдирд╣реАрдВ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореГрддреНрдпреБ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрдЪрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ рдХреБрдЫ рднреА рди рдЦреЛрдПрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рдЬреНрдп рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдЗрд╕реЗ рдХреЗрдВрджреНрд░реАрдп рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдХреАрдбрд╝реЗ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд╣рд▓ рд╣реИрдВред


MVVM


 class MovieViewModel(private val repository: Repository) { val moviesObservable: ObservableProperty<List<Movie>> = MutableObservableProperty() val errorObservable: ObservableProperty<Throwable> = MutableObservableProperty() fun loadMovies() { coroutineScope.launch { when (val result = repository.loadMovies()) { is Either.Left -> errorObservable.value = result.value is Either.Right -> moviesObservable.value = result.value } } } } 

рдЖрдЗрдП рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ:


  1. MVVM рдореЗрдВ, VIew рдХрд╛ рдЕрдм рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ ViewModel рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред
  2. ViewModel рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡реНрдпреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред (рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ)
  3. MVVM рдореЗрдВ, рд░рд╛рдЬреНрдп рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ViewModel рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ View рдбреЗрдЯрд╛ рд▓реЗрддрд╛ рд╣реИред рдЬрдм рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╕рдордп рджреГрд╢реНрдп рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ (рдФрд░ рдЖрдк рднреА рдПрдХ рдирдЦрд░реЗ рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореГрддреНрдпреБ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

MVI


рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд░рд┐рдпрд╛, рдкрдХреНрд╖ рдФрд░ рд░рд╛рдЬреНрдп


 sealed class Action { class LoadAction(val page: Int) : Action() class ShowResult(val result: List<Movie>) : Action() class ShowError(val error: Throwable) : Action() } sealed class SideEffect { class LoadMovies(val page: Int) : SideEffect() } data class State( val loading: Boolean = false, val data: List<Movie>? = null, val error: Throwable? = null ) 

рдЗрд╕рдХреЗ рдмрд╛рдж Reducer рдЖрддрд╛ рд╣реИ


 val reducer = { state: State, action: Action -> when (action) { is Action.LoadAction -> state.copy(loading = true, data = null, error = null) to setOf( SideEffect.LoadMovies(action.page) ) is Action.ShowResult -> state.copy( loading = false, data = action.result, error = null ) to emptySet() is Action.ShowError -> state.copy( loading = false, data = null, error = action.error ) to emptySet() } } 

рдФрд░ SideHffects рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП EffectHandler


 class MovieEffectHandler(private val movieRepository: MovieRepository) : EffectHandler<SideEffect, Action> { override fun handle(sideEffect: SideEffect) = when (sideEffect) { is SideEffect.LoadMovies -> flow { when (val result = movieRepository.loadMovies(sideEffect.page)) { is Either.Left -> emit(Action.ShowError(result.value)) is Either.Right -> emit(Action.ShowResult(result.value)) } } } } 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ:


  1. MVI рдореЗрдВ, рд╣рдореЗрдВ View рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд░реЗрдВрдбрд░ (рд╕реНрдЯреЗрдЯ) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  2. рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд╛рдЬреНрдп рд╣реИ, рдЬреЛ рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  3. рдПрдорд╡реАрдЖрдИ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рд╣реИ рдХрд┐ рд╣рдо рдХрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЗрдВрджреНрд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд▓рд┐рдЦреЗрдВред рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд▓рд╕ рд╕реНрдЯреЗрдЯ рд▓рдЧрд╛рддрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореГрддреНрдпреБ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


MVVM рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореГрддреНрдпреБ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣рд╛рдВ рдХреА рд╕реНрдерд┐рддрд┐ рдЕрднреА рднреА рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реИ рдФрд░ рдХреЗрдВрджреНрд░ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдорд╛рдЗрдирд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕реНрдерд┐рддрд┐ рдПрдорд╡реАрдкреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рдЧрдИ рд╣реИред рдПрдорд╡реАрдЖрдИ рд░рд╛рдЬреНрдп рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реА рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, UI рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рд╡рд░реНрддрдорд╛рди UI рдЯреВрд▓рдХрд┐рдЯ рдЦрд░рд╛рдм рд╣реИред MVVM рдореЗрдВ, рд╣рдо UI рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ MVI рдореЗрдВ рд╣рдо рдЗрд╕реЗ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп ui рдХреЗ рд▓рд┐рдП, MVVM рдмреЗрд╣рддрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдПрдорд╡реАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЖрднрд╛рд╕реА / рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдбреЛрдо рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ: рд▓рд┐рдереЛ, рдПрд╡рд┐рд▓, рдЬреЗрдЯрдкреИрдХ рдХрдВрдкреЛрдЬ (рдЖрдкрдХреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдбрд┐рдлрд░реЗрдВрд╢рд┐рдпрд▓ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред


рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рднреА рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп MVVM рдФрд░ MVI рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░реЗрдВред рддреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдореЗрдВ)ред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
MVVM - https://github.com/Miha-x64/Lychee
MVI - https://github.com/egroden/mvico , https://github.com/badoo/MVICore , https://github.com/arkivanov/MVIDroid


рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi467983/


All Articles