Skip to content

BindableViewModel

kaloglu edited this page Jun 14, 2020 · 3 revisions

Sample Implementation for BindableViewModel with MVI Events & States

@ExperimentalCoroutinesApi
@InternalCoroutinesApi
class TweetListViewModel(private val getTweetListUseCase: GetTweetListUseCase)
    : BindableViewModel<TweetListEvent, TweetListState>(TweetApplication.instance) {

    @get:Bindable
    var list by bindable(listOf<TweetWithUser>())
        internal set

    init {
        onInit()
    }

    override fun onInit() {
        getTweetListUseCase.coroutineScope = viewModelScope
        getTweetListUseCase.onEach {
            it.handleResource()
        }
    }

    override fun onEvent(event: TweetListEvent) {
        super.onEvent(event)
        when (event) {
            is TweetListEvent.GetTweetList -> getTweetListUseCase.execute(event.userId)
        }
    }

    /**
    * Handling for Network states
    **/
    @Suppress("UNCHECKED_CAST")
    private fun <T> Resource<T>.handleResource() =
            when (status) {
                Status.ERROR -> postState(TweetListState.Error(message!!))
                Status.LOADING -> postState(TweetListState.Loading)
                Status.SUCCESS -> setList(data!! as List<TweetWithUser>, TweetListState.Success)
                Status.EMPTY -> setList(listOf(), TweetListState.Empty)
            }

    @ExperimentalCoroutinesApi
    @InternalCoroutinesApi
    fun setList(list: List<TweetWithUser>, state: TweetListState? = null) {
        this.list = list.toMutableList()
        state?.let {
            postState(state)
        }
    }
}

Sample for Implementation BaseViewModelFactory

@InternalCoroutinesApi
@ExperimentalCoroutinesApi
class TweetListViewModelFactory constructor(lifecycle: Lifecycle, private val getUseCase: GetTweetListUseCase = GetTweetListUseCase())
    : BaseViewModelFactory<AndroTweetApp>(AndroTweetApp.instance, lifecycle) {

    @Suppress("UNCHECKED_CAST")
    override fun <VM : ViewModel?> create(modelClass: Class<VM>) = when {
        TweetListViewModel::class.java.isAssignableFrom(modelClass) -> {
            registerLifecycle(lifecycle)
            TweetListViewModel(getUseCase) as VM
        }
        else -> super.create(modelClass)
    }

    private fun registerLifecycle(lifecycle: Lifecycle) {
        getUseCase.registerLifecycle(lifecycle)
    }
}

Clone this wiki locally