在 Jetpack Compose 中,所有屏幕都是可组合功能。
Fragments
未在 Jetpack Compose 中使用。
我们如何使用 Jetpack Compose 处理生命周期事件?如果我们使用 Fragment,我们可以处理生命周期事件 (
onStart/onPause/onResume/onStop
)。这些对于释放资源、停止观察更改等不同场景很有用。
在 Jetpack Compose 中,如果我需要处理这些事件,我该如何在可组合屏幕中做到这一点?
请帮助我一些想法或资源,以便我能理解这一点。
提前致谢。
您可以获得LifecycleOwner
val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
并使用
LifecycleEventObserver
注册 DisposableEffect
并在 DisposableEffect
的 onDispose 函数上删除此观察者。
如果您传递的函数在重组过程中可能会发生变化,您也可以使用 RememberUpdatedState。
我添加了一个示例
@Composable
private fun DisposableEffectWithLifeCycle(
onResume: () -> Unit,
onPause: () -> Unit,
) {
val context = LocalContext.current
// Safely update the current lambdas when a new one is provided
val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
Toast.makeText(
context,
"DisposableEffectWithLifeCycle composition ENTER",
Toast.LENGTH_SHORT
).show()
val currentOnResume by rememberUpdatedState(onResume)
val currentOnPause by rememberUpdatedState(onPause)
// If `lifecycleOwner` changes, dispose and reset the effect
DisposableEffect(lifecycleOwner) {
// Create an observer that triggers our remembered callbacks
// for lifecycle events
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_CREATE -> {
Toast.makeText(
context,
"DisposableEffectWithLifeCycle ON_CREATE",
Toast.LENGTH_SHORT
).show()
}
Lifecycle.Event.ON_START -> {
Toast.makeText(
context,
"DisposableEffectWithLifeCycle ON_START",
Toast.LENGTH_SHORT
).show()
}
Lifecycle.Event.ON_RESUME -> {
currentOnResume()
}
Lifecycle.Event.ON_PAUSE -> {
currentOnPause()
}
Lifecycle.Event.ON_STOP -> {
Toast.makeText(
context,
"DisposableEffectWithLifeCycle ON_STOP",
Toast.LENGTH_SHORT
).show()
}
Lifecycle.Event.ON_DESTROY -> {
Toast.makeText(
context,
"DisposableEffectWithLifeCycle ON_DESTROY",
Toast.LENGTH_SHORT
).show()
}
else -> {}
}
}
// Add the observer to the lifecycle
lifecycleOwner.lifecycle.addObserver(observer)
// When the effect leaves the Composition, remove the observer
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
Toast.makeText(
context,
"DisposableEffectWithLifeCycle composition EXIT",
Toast.LENGTH_SHORT
)
.show()
}
}
Column(modifier = Modifier.background(Color(0xff03A9F4))) {
Text(
text = "Disposable Effect with lifecycle",
color = Color.White,
modifier = Modifier
.padding(8.dp)
.fillMaxWidth()
)
}
}
示范
val context = LocalContext.current
DisposableEffectWithLifeCycle(
onResume = {
Toast.makeText(
context,
"DisposableEffectWithLifeCycle onResume()",
Toast.LENGTH_SHORT
)
.show()
},
onPause = {
Toast.makeText(
context,
"DisposableEffectWithLifeCycle onPause()",
Toast.LENGTH_SHORT
)
.show()
}
)
创建函数
@Composable
fun ComposableLifecycle(
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
onEvent: (LifecycleOwner, Lifecycle.Event) -> Unit
) {
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { source, event ->
onEvent(source, event)
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}
在屏幕内调用此函数
val TAG = "SecondScreen"
ComposableLifecycle { _, event ->
when (event) {
Lifecycle.Event.ON_CREATE -> {
Log.d(TAG, "onCreate")
}
Lifecycle.Event.ON_START -> {
Log.d(TAG, "On Start")
}
Lifecycle.Event.ON_RESUME -> {
Log.d(TAG, "On Resume")
}
Lifecycle.Event.ON_PAUSE -> {
Log.d(TAG, "On Pause")
}
Lifecycle.Event.ON_STOP -> {
Log.d(TAG, "On Stop")
}
Lifecycle.Event.ON_DESTROY -> {
Log.d(TAG, "On Destroy")
}
else -> {}
}
}
启动其他应用程序的 Activity 后无法触发。