7
4

More than 3 years have passed since last update.

Composeのライフサイクル (onActive, onCommit, onDispose) についてメモ

Last updated at Posted at 2020-12-06

割とすぐ忘れるので。

以下のようになっていた場合。

@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
7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4