前言
忙碌了大半年,项目总算是能稳定运行了,这两天空余时间比较多,稍微研究了一下Compose相关的知识,然后发现自己之前写的声明周期监听,这是什么玩意儿!这里再提供一个系统本身就有的方法,更简洁、更稳定。
简单版本
val lifecycleOwner = LocalLifecycleOwner.current
LaunchedEffect(Unit){
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED){
// onCreate 时调用的方法
}
}
LaunchedEffect(Unit){
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED){
// onResume 时调用的方法
}
}
只需要改变 Lifecycle.State
就可以对应不同的声明周期,切记,每个生命周期需要独立的 LaunchedEffect
作用域,否则会不生效。
完整版本
上面的 Lifecycle.State
可以解决初始化或者刷新的问题,但是没有解决 onPause
onStop
的生命周期,这个时候就需要使用 Lifecycle.Event
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner ){
val observer = LifecycleEventObserver { source, event ->
when (event) { //根据Event执行不同生命周期的操作
Lifecycle.Event.ON_CREATE -> {}
Lifecycle.Event.ON_RESUME -> {}
Lifecycle.Event.ON_PAUSE -> {}
else -> {}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose{
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
封装一下,方便使用
@Composable
fun LifecycleEffect(
onCreate: (() -> Unit)? = null,
onStart: (() -> Unit)? = null,
onResume: (() -> Unit)? = null,
onPause: (() -> Unit)? = null,
onStop: (() -> Unit)? = null,
onDestroy: (() -> Unit)? = null,
) {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_CREATE -> onCreate?.invoke()
Lifecycle.Event.ON_START -> onStart?.invoke()
Lifecycle.Event.ON_RESUME -> onResume?.invoke()
Lifecycle.Event.ON_PAUSE -> onPause?.invoke()
Lifecycle.Event.ON_STOP -> onStop?.invoke()
Lifecycle.Event.ON_DESTROY -> onDestroy?.invoke()
else -> {}
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}
总结
通过以上两种方法监听生命周期,可以使用在任何Compose作用域内,自定义控件可以完全独立,使用起来也会更加方便。