割とすぐ忘れるので。
以下のようになっていた場合。
@Composable
fun Screen() {
var selectedTab by remember<MutableState<Tabs>>{ mutableStateOf(Tabs.Tab1) }
println("no wrap $selectedTab")
onActive {
println("onActive")
onDispose {
println("onDispose in onActive")
}
}
onCommit {
println("onCommit 1")
onDispose {
println("onDispose in onCommit 1")
}
}
onCommit(selectedTab) {
println("onCommit 2")
onDispose {
println("onDispose in onCommit 2")
}
}
onDispose {
println("onDispose")
}
...
onActive()
基本的に一回だけ呼ばれるが、このComposable関数自体が使われなくなればonActive内のonDispose()が呼ばれ、またこのComposableが使われた時にonActive()が呼ばれる。
また外側のActivityがdestroyなどになってもonDispose()が呼ばれる。
onCommit()
基本的に変更ごとに毎回呼ばれる。そのたびに以前にonCommitされていれば、onDispose()が呼び出される。
引数なしでは、基本的にこの外に書くのと違いがなさそうで、引数無しで呼び出されることはなさそう。(そういうパターンがあれば教えていただきたいです。タイミングが違ったりする?)
onCommit(argment)
onActive同様のタイミングと引数が変わったタイミングで呼ばれる。また引数がわかったときにはonDisponseも呼ばれる。
動作を見てみる
起動するだけ
I/System.out: no wrap Tab1
I/System.out: onActive
I/System.out: onCommit 1
I/System.out: onCommit 2
selectedTabの変更
I/System.out: no wrap Tab2
I/System.out: onDispose in onCommit 2
I/System.out: onDispose in onCommit 1
I/System.out: onCommit 1
I/System.out: onCommit 2
selectedTab以外の変更があったとき
I/System.out: no wrap Tab2
I/System.out: onDispose in onCommit 1
I/System.out: onCommit 1
Screen()自体が使われなくなったとき
I/System.out: onDispose
I/System.out: onDispose in onCommit 2
I/System.out: onDispose in onCommit 1
I/System.out: onDispose in onActive
アプリ終了時
I/System.out: onDispose
I/System.out: onDispose in onCommit 2
I/System.out: onDispose in onCommit 1
I/System.out: onDispose in onActive