بعد از مدت ها مشغله در کار و زندگی برگشتم با ادامه معماری 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
متفاوت خواهد بود به دلیل اینکه در این معماری ها لایه های مختلفی قرار داره اما اصل معماری به همین سادگی هستش.