Skip to content

Instantly share code, notes, and snippets.

class LiveEventViewModel {
...
private val liveData = MutableLiveData<String>()
val singleLiveEvent = liveData.toSingleEvent()
...
... {
liveData.value = "YES"
}
}
fun <T> LiveData<T>.toSingleEvent(): LiveData<T> {
val result = LiveEvent<T>()
result.addSource(this) {
result.value = it
}
return result
}
@hadilq
hadilq / LiveEvent.kt
Last active February 8, 2021 08:59
class LiveEvent<T> : MediatorLiveData<T>() {
private val observers = ConcurrentHashMap<LifecycleOwner, MutableSet<ObserverWrapper<T>>>()
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
val wrapper = ObserverWrapper(observer)
val set = observers[owner]
set?.apply {
add(wrapper)
fun initView() {
...
adapter.onCreateViewHolder = { viewHolder ->
// Pipe the View actions to the ViewModel
viewHolder.actionStream.subscribe(viewModel.actionStream::onNext).track()
}
...
}
abstract class BaseViewHolder<in T : ViewData>(view: View) : RecyclerView.ViewHolder(view) {
val actionStream = PublishSubject.create<Action>()
}
class ExampleViewModel @Inject constructor(
...
) : BaseViewModel() {
init {
actionStream.filterTo(ClickedAction::class.java)
.throttleFirst(1, TimeUnit.SECONDS) // Avoid double click(Multi view click) less than one second
.subscribe(::clicked).track()
}
}
class ExampleViewModel @Inject constructor(
...
) : BaseViewModel() {
init {
val stream = actionStream
.compose(::firstLoggerMiddlewareFunction)
.compose(::secondLoggerMiddlewareFunction)
.share()
private fun clicked() {
viewModel.actionStream.onNext(ClickedAction())
}
class ExampleViewModel @Inject constructor(
...
) : BaseViewModel() {
init {
actionStream.filterTo(ClickedAction::class.java)
.subscribe(::clicked).track()
}
private fun clicked(clickedAction: clickedAction) {
inline fun <T, reified E : T> Observable<in T>.filterTo(
@Suppress("UNUSED_PARAMETER") target: Class<E>
): Observable<out E> = this.filter {
when (it) {
is E -> true
else -> false
}
}.map { it as E }