Android开发 compose组件 帮我写 封装一个高效而且适配Viewmode生命周期的FlowBus 要求kotlin完整代码和使用方法
时间: 2023-06-17 18:07:58 浏览: 188
好的,您的需求已经被记录下来了。关于您的问题,ChitGPT理解了您的需求,下面是kotlin完整代码和使用方法的答案:
```kotlin
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import java.util.concurrent.ConcurrentHashMap
/**
* 一个高效而且适配Viewmode生命周期的FlowBus
*/
object FlowBus {
private val flowMap = ConcurrentHashMap<String, MutableSharedFlow<Any>>()
/**
* 发送事件
*/
fun post(key: String, value: Any) {
flowMap[key]?.tryEmit(value)
}
/**
* 监听事件
*/
inline fun <reified T> on(key: String, owner: LifecycleOwner, crossinline action: suspend (T) -> Unit) {
val flow = flowMap.getOrPut(key) { MutableSharedFlow() }
val observer = Observer<T> { value ->
GlobalScope.launch(Dispatchers.Main) { action(value) }
}
flow.asSharedFlow()
.onEach { value ->
if (owner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
observer.onChanged(value as T)
}
}
.launchIn(GlobalScope)
owner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onDestroy(owner: LifecycleOwner) {
flowMap.remove(key)
super.onDestroy(owner)
}
})
}
}
```
使用方法如下:
```kotlin
// 发送事件
FlowBus.post("key", "value")
// 监听事件
FlowBus.on<String>(key = "key", owner = this) { value ->
// 处理事件
}
```
您可以根据需要替换`key`和`value`类型。`on`方法中的`owner`参数可以是`Activity`或`Fragment`等实现了`LifecycleOwner`接口的类,用来自动管理生命周期。
希望这个代码对您有所帮助,如果您还有其他问题请继续提问。
阅读全文