بعد از مدت ها مشغله در کار و زندگی برگشتم با ادامه معماری MVI در خدمت دوستان پارس کلیکی هستم در بخش اول معرفی کوتاهی از بخش های مختلف این معماری داشتم و به صورت کوتاه اشاراتی داشتیم در این بخش قصد دارم پیاده سازی این معماری رو بهتون آموزش بدم:

لایه Model

در دیگر معماری ها Models به دید یک لایه نگهدارنده دیتا نگاه شده است در واقع Back کار بودند به مانند ارتباط دهنده API و دیتابیس، در معماری MVI علاوه بر این با ساخت یوآی به صورت state مواجه هستیم که دایمی هستند به طور مثال اگر مادل را به صورت یک دیتا کلاسی از Movie در نظر بگیریم:

data class Movie (
    var id: Long? = null,
    var countryProduct: String? = null,
    var rateImdb: String? = null,
    var categoryName: String? = null,
    var director: String? = null,
)

یکی از قابلیت های خیلی خوب که خیلی ازش استفاده میکنم استفاده از sealed class ها در تعریف state های مختلف هست برای نمونه در اینجا با توجه به دیتا کلاسی از Movie داریم چند حالت در DataState خود داریم:

sealed class MovieState {
  object LoadingState : MovieState()
  data class DataState(val data: List<Movie>) : MovieState()
  data class ErrorState(val data: String) : MovieState()
}

Views and Intents

مانند معماری MVP معماری MVI برای ویو یک interface در نظر می گیرد:

interface MainView {
    fun displayMoviesIntent()
    fun render(state: MovieState)
}

که توسط اکتیویتی یا فرگمنت implement می شود در واقع می توان گفت که ویو در MVI تمایل داره از intent استفاده کنه که به اکشن کاربر پاسخ بده در نهایت بر طبق state ها و اینترفیس حالت ها در اکتیویتی به شکل زیر خواهد بود:

class MainActivity : MainView {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
  }

  //implement interface
  override fun displayMoviesIntent() = button.clicks()

  //implement interface
  override fun render(state: MovieState) {
    when(state) {
      is MovieState.DataState -> renderDataState(state)
      is MovieState.LoadingState -> renderLoadingState()
      is MovieState.ErrorState -> renderErrorState(state)
    }
  private fun renderDataState(dataState: MovieState.DataState) {
      //Render movie list
  }
  private fun renderLoadingState() {
      //Render progress bar on screen
  }
  private fun renderErrorState(errorState: MovieState.ErrorState) {
      //Display error mesage
  }
  }

این آموزش ساده ای از معماری MVI بود تمامی موارد بالا براساس تلفیق با معماری دیگر مانند MVVM و Clean متفاوت خواهد بود به دلیل اینکه در این معماری ها لایه های مختلفی قرار داره اما اصل معماری به همین سادگی هستش.