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

How to listen for lifecycle in Jetpack Compose

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

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

    DisposableEffect(key1 = vm) {
        onDispose {
            vm.cancelSearch()
        }
    }
}

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

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

Jetpack Compose的每次重组都是一个生命周期,检测每次重组时的水平和垂直状态,请尝试

@Composable
fun Test() {
    var status by rememberSaveable{
        mutableStateOf(true)
    }
    LaunchedEffect(LocalConfiguration.current.orientation.absoluteValue){
        status = !status
    }
    Text(text = "is Horizontally $status")
}

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

@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)
        }
    }
}

使用方法:

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

Example in meduim