Open5

公式ドキュメントを雑に読んでみる

darmaT0o0darmaT0o0

コンポーザブルのライフサイクル

https://developer.android.com/develop/ui/compose/lifecycle?hl=ja

  • State<T>にオブジェクト変更をトリガーに再コンポジションされる

入力が変化していない場合には、再コンポーズが発生しない時がある
https://developer.android.com/develop/ui/compose/lifecycle?hl=ja#skipping

  1. @Composable関数がUnit以外の戻り値の型がある
  2. 関数に @NonRestartableComposable または @NonSkippableComposable のアノテーションが付いている。
  3. 必須パラメータの型が不安定な時

基本時に再コンポーズされるタイミングは、安定な値が、何らかの方法で、変更されたときに処理が実行されます。このときの、安定な値とは、

  • すべてがプリミティブな型
  • 文字列型
  • すべての関数型(ラムダ)
  • 安定しているが可変である型MutableState型のState.valueに変更が通知される

@Composable関数の引数全ての型が安定していて、前回の呼び出し行こうと、すべての値が変更がない場合のみ、再描画がスキップする

安定しているものとして扱うには、@Stableアノテーションをつける

@Stable
interface UiState<T : Result<T>> {
    val value: T?
    val exception: Throwable?

    val hasError: Boolean
        get() = exception != null
}
darmaT0o0darmaT0o0

Composeにおける副作用

https://developer.android.com/develop/ui/compose/side-effects?hl=ja

作用とは、UIを出力せずに、コンポジションの完了時に副作用の実行を引き起こすコンポーズ可能な関数。
副作用とは、@Composable関数の範囲外で発生するアプリの状態の変化のこと
副作用が、がないようにするのが理想的である。

  • LaunchedEffect: @Composableのスコープ内でsuspend関数を実行する
  • rememberCoroutineScope: Composable外部からコルーチンを起動できる
    • 初回の描画(入場)時に、CoroutineScopeが作成され、Composableが破棄されるタイミングに合わせてCoroutineScopeも破棄される
    • 下記参考

https://zenn.dev/kaleidot725/articles/2022-02-13-jc-remember-coroutine-scope

  • rememberUpdatedState: 値が変化しても再起動すべきではない作用の値を参照します。

https://developer.android.com/develop/ui/compose/side-effects?hl=ja#rememberupdatedstate

darmaT0o0darmaT0o0

Jetpack Composeのフェーズ

https://developer.android.com/develop/ui/compose/phases?hl=ja
複数のフェーズを介して、フレームをレンダリングする

  • Android View

    • 測定
    • Layout
    • Drawing
  • Compose

    • Composition
    • Layout
    • Drawing

Composeについてそれぞれのフェーズ

  • Compositionでは、UIを表すツリー構造を作る
  • Layoutでは、
    • Nodeの子を測定する
    • 独自のサイズを決定する
    • 子ノードを配置する

Layout終了時には、width,height、座標のx,yが割当られる