Skip to content

ライフサイクル

Compose Multiplatformにおけるコンポーネントのライフサイクルは、Jetpack Composeのライフサイクルの概念を採用しています。 ライフサイクルを認識するコンポーネントは、他のコンポーネントのライフサイクル状態の変化に反応することができ、より整理され、多くの場合軽量で、メンテナンスが容易なコードを作成するのに役立ちます。

Compose Multiplatformは共通の LifecycleOwner 実装を提供します。これは、オリジナルの Jetpack Compose の機能を他のプラットフォームに拡張し、共通コードでライフサイクル状態を監視するのに役立ちます。

マルチプラットフォームの Lifecycle 実装を使用するには、commonMain ソースセットに以下の依存関係を追加します。

kotlin
kotlin {
    // ...
    sourceSets {
        // ...
        commonMain.dependencies {
            // ...
            implementation("org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.9.6")
        }
        // ...
    }
}

マルチプラットフォームの Lifecycle 実装の変更は、What's new で確認するか、Compose Multiplatform の変更履歴 で特定の EAP リリースを追跡できます。

状態とイベント

ライフサイクルの状態とイベントのフロー(Jetpack のライフサイクルと同じです):

ライフサイクルの図

ライフサイクルの実装

通常、コンポーザブルに固有のライフサイクルは必要ありません。共通の LifecycleOwner が、相互に関連するすべてのエンティティにライフサイクルを提供します。デフォルトでは、Compose Multiplatform によって作成されたすべてのコンポーザブルは同じライフサイクルを共有します。これにより、イベントをサブスクライブしたり、ライフサイクル状態を参照したりすることができます。

LifecycleOwner オブジェクトは CompositionLocal として提供されます。 特定のコンポーザブルのサブツリーに対して個別にライフサイクルを管理したい場合は、独自に LifecycleOwner 実装を作成できます。

マルチプラットフォームのライフサイクルでコルーチンを扱う場合、Lifecycle.coroutineScope の値が Dispatchers.Main.immediate の値に紐付けられていることに注意してください。これは、デスクトップターゲットではデフォルトで使用できない場合があります。 ライフサイクル内のコルーチンや Flow を Compose Multiplatform で正しく動作させるには、プロジェクトに kotlinx-coroutines-swing の依存関係を追加してください。 詳細は Dispatchers.Main のドキュメントを参照してください。

  • ナビゲーションコンポーネントでのライフサイクルの仕組みについては、ナビゲーションとルーティングで確認してください。
  • マルチプラットフォームの ViewModel 実装の詳細については、共通 ViewModel ページを参照してください。

Android ライフサイクルの他プラットフォームへのマッピング

iOS

ネイティブのイベントと通知ライフサイクルイベントライフサイクル状態の変化
viewDidDisappearON_STOPSTARTEDCREATED
viewWillAppearON_STARTCREATEDSTARTED
willResignActiveON_PAUSERESUMEDSTARTED
didBecomeActiveON_RESUMESTARTEDRESUMED
didEnterBackgroundON_STOPSTARTEDCREATED
willEnterForegroundON_STARTCREATEDSTARTED
viewControllerDidLeaveWindowHierarchyON_DESTROYCREATEDDESTROYED

Web

Wasm ターゲットの制限により、ライフサイクルは以下のようになります:

  • アプリケーションは常にページにアタッチされているため、CREATED 状態をスキップします。
  • Web ページは通常、ユーザーがタブを閉じたときにのみ終了するため、DESTROYED 状態には到達しません。
ネイティブイベントライフサイクルイベントライフサイクル状態の変化
visibilitychange (表示状態になる)ON_STARTCREATEDSTARTED
focusON_RESUMESTARTEDRESUMED
blurON_PAUSERESUMEDSTARTED
visibilitychange (非表示状態になる)ON_STOPSTARTEDCREATED

デスクトップ

Swing リスナーのコールバックライフサイクルイベントライフサイクル状態の変化
windowIconifiedON_STOPSTARTEDCREATED
windowDeiconifiedON_STARTCREATEDSTARTED
windowLostFocusON_PAUSERESUMEDSTARTED
windowGainedFocusON_RESUMESTARTEDRESUMED
disposeON_DESTROYCREATEDDESTROYED