如何在 Jetpack Compose 中监听生命周期

Jee*_*eva 3 android kotlin android-jetpack-compose

我正在使用 Jetpack Compose 创建一个应用程序。该应用程序在后台进行一些网络搜索。如果用户决定按后退按钮,我想取消搜索。所以我用DisposableEffect.

@Composable
fun SecondScreen() {
    val vm: MainViewModel = hiltViewModel()

    DisposableEffect(key1 = vm) {
        onDispose {
            vm.cancelSearch()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道onDispose当可组合项被销毁时会调用它。但现在每次旋转屏幕时搜索都会被取消。我可以理解这一点,因为可组合项被破坏并重新创建。

我想知道我是否可以检测屏幕旋转生命周期,也许我可以防止这种行为。或者是否有更好的方法在用户按返回时取消搜索?

Mah*_*eei 24

我写了这个 fun,你可以在每个可组合的 fun 中调用它

@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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用:

@Composable
fun VideoPlayer() {
    ...
    ComposableLifecycle { source, event ->
        if (event == Lifecycle.Event.ON_PAUSE) {
            exoPlayer.pause()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

中的示例