アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

@ComposableのライフサイクルとCoroutine【Jetpack Compose (Desktop)】

バージョン情報

plugins {
    kotlin("jvm") version "1.4.20"
    id("org.jetbrains.compose") version "0.2.0-build132"
}

注釈 0.3.0-build150

CompositionLifecycleObserverRememberObserver に名前が変わりました。

ライフサイクル

ライフサイクルは以下のように購読できます。表示時に onEter 、非表示時に onLeave が呼ばれます。何かにregisterするわけではないのでわかりにくいですね。

@Composable
fun hoge() {
    remember {
        object : CompositionLifecycleObserver {
            override fun onEnter() {
                
            }

            override fun onLeave() {
                
            }
        }
    }
}

Coroutine

Jetpack ComposeでCoroutineが使用したい場合は以下を使用します。
LaunchedEffectImpl は内部的に CompositionLifecycleObserver を使用しています。

@Composable
@ComposableContract(restartable = false)
fun LaunchedEffect(
    subject: Any?,
    block: suspend CoroutineScope.() -> Unit
) {
    val applyContext = currentComposer.applyCoroutineContext
    remember(subject) { LaunchedEffectImpl(applyContext, block) }
}

以下のように使用します。最初の一度だけ実行されます。引数を変更した時は再度実行されます。

val count = remember { mutableStateOf(0) }
Column {
    Button(onClick = { count.value++ }) {
        Text(text = "Button")
    }

    LaunchedEffect(null) {
        println("LaunchedEffect(null)")
    }

    LaunchedEffect(count.value) {
        println("LaunchedEffect(count)")
    }
}

起動 -> ボタンを3回押したときの出力

LaunchedEffect(null)
LaunchedEffect(count)
LaunchedEffect(count)
LaunchedEffect(count)
LaunchedEffect(count)