Android 利用 LiveData 共享数据,进行跨界面数据传递
Posted 匆忙拥挤repeat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 利用 LiveData 共享数据,进行跨界面数据传递相关的知识,希望对你有一定的参考价值。
import androidx.lifecycle.MutableLiveData
/**
* desc: 共享事件,进行跨界面数据传递
* author: stone
* email: aa86799@163.com
* time: 2021/10/15 16:01
*/
class LiveDataBus private constructor() : MutableLiveData<Event<FlashEvent>>() {
companion object {
val instance by lazy { LiveDataBus() }
}
}
// event: 事件类型; data: 要传递的数据
data class FlashEvent(val event: Int, val data: Any) {
companion object {
const val EVENT_TEST = 1 // 测试事件
}
}
LiveDataBus 单例实现,value 可变。
FlashEvent 自定义 事件
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
if (!hasBeenHandled) {
hasBeenHandled = true
return content
}
return null
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
import androidx.lifecycle.Observer
class EventObserver<T>(private val onEventUnhandledContent: (T) -> Unit) : Observer<Event<T>> {
override fun onChanged(event: Event<T>?) {
event?.getContentIfNotHandled()?.let { value ->
onEventUnhandledContent(value)
}
}
}
Event 提供 getContentIfNotHandled()
EventObserver 结合 Event,实现 onChanged(),未处理事件时才调用传入的函数
// 发送事件
LiveDataBus.instance.value = Event(FlashEvent(FlashEvent.EVENT_TEST))
// 处理事件
LiveDataBus.instance.observe(viewLifecycleOwner, EventObserver {
if (it.event == FlashEvent.EVENT_TEST) {
// do sth.
}
})
以上是关于Android 利用 LiveData 共享数据,进行跨界面数据传递的主要内容,如果未能解决你的问题,请参考以下文章
Android MVVM:具有多个片段的活动 - 将共享 LiveData 放在哪里?
Android Studio 之 ROM, LiveData+ViewModel+AsyncTask+Repository