1. ライフサイクルと再コンポーズ - Ki-Kobayashi/Android-Wiki GitHub Wiki

🟩 用語

🟩 Activityのライフサイクル

Activity がデータを失う(ライフサイクルが終了する)のは、以下のケース

  • ユーザーがデバイスの言語を変更した場合
  • デバイスの向きが変わった場合
  • ユーザーがデバイスをホルダーに装着(別のディスプレイサイズやレイアウト利用)した場合

.

🟡 データ消失をしないためには?

viewModelでデータを管理するようにする

.

🟩 Composableのライフサイクル

Composition におけるコンポーザブルのライフサイクル。

  • コンポーザブルは Composition に入場
  • 0 回以上再コンポースされ、
  • Composition から退場。

.

  • コンポーザブルのライフサイクルは、ビュー、アクティビティ、フラグメントのライフサイクルより単純
  • 複雑なライフサイクルを持つ外部リソースを管理または操作する必要がある場合、「作用」を使用する

.

🟩 再コンポーズ

  • 再コンポーズは State 系 の .value プロパティに対する変更によってトリガー
  • 状態(入力)が変化していなければ再コンポーズを回避 
  • 🚨注意🚨Column(LazyColumn)など複数の Conposable を配置する場合、次項に注意する必要がある

.

🟩 不要な再コンポーズを避ける方法

🟡 Column(LazyColumn)など複数の Conposable を配置する場合

  1. 末尾にItemを追加・削除する場合:
    → 既存Itemは再コンポーズされない
  1. 🚨並び替え・末尾以外の追加・削除する場合:
    → 並び順がかわるため、リスト全体が再コンポーズされてしまう

.

🟡 【2】の不要な再コンポーズを避けるには?

💡**「key」をItemに割り当てる**(下記例では、movie.id)
 (※リスト内で一意であればOK)
  

@Composable
fun MoviesScreen(movies: List<Movie>) {
    LazyColumn {
        items(movies, key = { movie -> movie.id }) { movie ->
            MovieOverview(movie)
        }
    }
}

.

🟡 不安定なものを状態変化がないなら再コンポーズをスキップさせる

Compose CompilerはComposable Functionsのパラメータの型・クラスをstable(安定)もしくはunstable(不安定)としてマークする

  • 安定:不変であるかもしくはComposeのrecompositionの間にその値が変更されたかどうかを検知できるもの
    • すべてのプリミティブ値型: Boolean、Int、Long、Float、Char など
    • 文字列
    • すべての関数型(ラムダ)
  • 不安定:Composeのrecompositionの間にその値が変更されたかどうかを検知できないもの
    • インターフェース
    • 独自Dataクラス

.

💎Compose が安定していると推測できない型を安定しているものとして扱うことを Compose に強制するには、@Stable アノテーションでマークする

// Marking the type as stable to favor skipping and smart recompositions.
@Stable
interface UiState<T : Result<T>> {
    val value: T?
    val exception: Throwable?

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

.

💎または、「Compose Stable Marker」を使用する

https://zenn.dev/mona/articles/article-compose-stable-maker#compose-stable-marker%E3%82%92%E8%A9%A6%E3%81%99

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

🟩

🟡

.

⚠️ **GitHub.com Fallback** ⚠️