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

LiveData 没有观察具有共享视图模型的子视图页面片段

Android-LiveData原理解析

Android---Jetpack之LiveData

Android LiveData使用