-
Notifications
You must be signed in to change notification settings - Fork 0
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)
}
}Full sample for databinding4vm : https://github.com/kaloglu/androtweet