navigationevent

  
Navigation Event ライブラリは、システム バックと予測型「戻る」を処理するための KMP ファースト API を提供します。
最新の更新 安定版リリース リリース候補版 ベータ版リリース アルファ版リリース
2025 年 11 月 19 日 1.0.0 - - -

依存関係の宣言

navigationevent への依存関係を追加するには、Google の Maven リポジトリをプロジェクトに追加する必要があります。詳しくは、Google の Maven リポジトリをご覧ください。

アプリまたはモジュールの build.gradle ファイルに、必要なアーティファクトの依存関係を追加します。

Groovy

dependencies {
    implementation "androidx.navigationevent:navigationevent:1.0.0"
}

Kotlin

dependencies {
    implementation("androidx.navigationevent:navigationevent:1.0.0")
}

依存関係について詳しくは、ビルド依存関係の追加をご覧ください。

フィードバック

お寄せいただいたフィードバックは Jetpack 改善の参考にさせていただきます。新しい問題が見つかった場合や、このライブラリを改善するアイデアをお持ちの場合は、お知らせください。新しい問題を報告していただく前に、このライブラリの既存の問題をご確認ください。スターボタンをクリックすると、既存の問題に投票できます。

新しい問題を報告する

詳細については、Issue Tracker のドキュメントをご覧ください。

このアーティファクトのリリースノートはありません。

バージョン 1.0

バージョン 1.0.0

2025 年 11 月 19 日

androidx.navigationevent:navigationevent-*:1.0.0 がリリースされました。バージョン 1.0.0 にはこれらの commit が含まれています。

1.0.0 の主な機能:

Navigation Event ライブラリが安定版になりました。Navigation Event は、Android(およびその他のプラットフォーム)でシステム「戻る」や予測型「戻る」などのシステムレベルのインタラクションを処理するための AndroidX ライブラリです。

  • NavigationEvent を処理するには、目的の関数をオーバーライドする独自の NavigationEventHandler を実装します。次に、ハンドラを NavigationEventDispatcher に追加する必要があります。Activity 1.12.0 リリース以降、ComponentActivity は新しい NavigationEventDispatcherOwner インターフェースを実装します。このインターフェースは、すぐに使用できるディスパッチャーを提供します。

    // The NavigationEventInfo provides information about a navigation state
    object CurrentInfo : NavigationEventInfo()
    
    // you can retrieve this from any component that is a NavigationEventDispatcherOwner
    // or you can instantiate your own custom dispatcher
    val dispatcher = myActivity.navigationEventDispatcher
    
    val myHandler = object : NavigationEventHandler<NavigationEventInfo>(
                initialInfo = CurrentInfo,
                isBackEnabled = true
            ) {
                override fun onBackStarted(event: NavigationEvent) {
                    // Prepare for the back event
                }
    
                override fun onBackProgressed(event: NavigationEvent) {
                    // Use event.progress for predictive animations
                }
    
                // This is the required method for final event handling
                override fun onBackCompleted() {
                    // Complete the back event
                }
    
                override fun onBackCancelled() {
                    // Cancel the back event
                }
            }
    
    dispatcher.addHandler(myHandler)
    
  • navigationevent:navigationevent-compose モジュールは、ハンドラを最も近い LocalNavigationEventDispatcherOwnerNavigationEventDispatcher に自動的にフックし、デベロッパーが目的の動作をパラメータとして提供できるようにする便利なコンポーズ関数 NavigationBackHandler を提供します。

    object CurrentInfo : NavigationEventInfo()
    object PreviousInfo : NavigationEventInfo()
    
    val navEventState = rememberNavigationEventState(
      currentInfo = CurrentInfo,
      backInfo = PreviousInfo
    )
    
    // Inside composition
    NavigationBackHandler(
        State = navEventState,
        isBackEnabled = true,
        // optional
        onBackCancelled = { // Cancel the back event },
        // required
        onBackCompleted = { // Complete the back event } ,
    )
    

Compose でこのパターンを使用すると、NavigationEventState を簡単にホイスティングして、さまざまなコンポーザブルで監視できるようになります(Navigation3 の場合、NavDisplay から状態をホイスティングできます)。

  • NavigationEventDispatcher は、コンポーズの場合とコンポーズ以外の場合の両方で、親ディスパッチャーを提供できます。これにより、複数のディスパッチャーを 1 つの親で管理できる階層構造を作成できます。親があると、無効化または破棄する必要があるディスパッチャーのグループの処理が比較的簡単になります。

    // Non-Compose
    val parentDispatcher = NavigationEventDispatcher()
    val childDispatcher = NavigationEventDispatcher(parent = parentDispatcher)
    
    // Compose
    val composeChildDispatcher = rememberNavigationEventDispatcher(
        // This defaults to `LocalNavigationEventDispatcherOwner.current`
        // Must explicitly provide null to have an unparented dispatcher created here
        parent = NavigationEventDispatch() 
    )
    
  • また、このライブラリを使用すると、NavigationEventInput を介して NavigationEventDispatcher にシグナルを直接提供することもできます。NavigationEventInput はナビゲーション システムの「入力」側として機能し、プラットフォーム固有のイベント(システムの戻るジェスチャーやボタンのクリックなど)を NavigationEventDispatcher に送信できる標準化されたイベントに変換します。navigationevent:navigationevent モジュールは現在、2 つの NavigationEventInput を提供しています。1 つは、任意のイベントをディスパッチできる汎用的な DirectNavigationEventInput で、もう 1 つは、NavigationEventDispatcher がシステム バックと予測型バック ジェスチャーをサポートできるようにする Android 固有の OnBackInvokedInput です。独自のディスパッチャーを実装する場合(ComponentActivity によって提供されるディスパッチャーを使用しない場合)、入力は手動で追加する必要があります。

    val dispatcher = NavigationEventDispatcher()
    
    dispatcher.addInput(DirectNavigationEventInput())
    dispatcher.addInput(OnBackInvokedDefaultInput(invoker))
    

バージョン 1.0.0-rc01

2025 年 11 月 5 日

androidx.navigationevent:navigationevent-*:1.0.0-rc01 がリリースされました。バージョン 1.0.0-rc01 にはこれらの commit が含まれています。

バージョン 1.0.0-beta01

2025 年 10 月 8 日

androidx.navigationevent:navigationevent-*:1.0.0-beta01 がリリースされました。バージョン 1.0.0-beta01 にはこれらの commit が含まれています。

API の変更

  • NavigationEvent.touchXNavigationEvent.touchYFloatRange アノテーションを修正しました。これらの値は絶対ピクセル座標を表し、1.0 の上限はありません。(I4b205b/445989313
  • NavigationEventDispatcherOwner コンポーザブルを rememberNavigationEventDispatcherOwner にリファクタリングします。この関数は NavigationEventDispatcherOwner を直接返すようになりました。このオーナーをサブコンポジションに提供するには、CompositionLocalProvider を使用します。(I874b2b/444446629

バージョン 1.0.0-alpha09

2025 年 9 月 24 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha09 がリリースされました。バージョン 1.0.0-alpha09 には、これらの commit が含まれています。

API の変更

  • Idle() をインスタンス化する代わりに、NavigationEventTransitionState.Idle シングルトン オブジェクトを直接使用します。(Ic7d9eb/444734264
  • 便宜的なコンストラクタを内部化し、直接構築するのではなく、パブリック NavigationEventDispatcher.history を介してインスタンスを取得します。(I3b7e0b/444734264
  • rememberNavigationEventState 経由で NavigationEventState を作成する必要があります。コンストラクタが internal になりました。(Ie143cb/444734264
  • onBackCompletedFallback を採用し、fallbackOnBackPressed の使用法とコンストラクタ パラメータを置き換えます。動作は変更されていません。完了した未処理の戻るイベントでのみ呼び出されます。(Idabe9b/444734264
  • NavigationEventHistory(mergedHistory, currentIndex) のプライマリ コンストラクタが internal になりました。外部コンシューマーは、パブリック コンストラクタ(空のコンストラクタまたはパーティション ベースのコンストラクタ)を使用してインスタンスを作成する必要があります。(I1c047b/444734264
  • View.setViewTreeNavigationEventDispatcherOwner で null 許容のオーナーを受け入れるようにしました(Ic9eb6b/444436762
  • NavigationEventInfointerface ではなく abstract class になりました。すべてのカスタム実装を更新して、クラス(data class MyInfo : NavigationEventInfo() など)から継承するようにします。(I1e59cb/444734264
  • 以前の NavigationEventDispatcher.state プロパティと getState<T>() 関数が削除されました。新しい個別の dispatcher.transitionState(ジェスチャーの進行状況用)フローと dispatcher.history(ナビゲーション スタック用)フローを使用します。(Ic2cebb/444734264
  • NavigationEventInput.onInfoChanged(...) コールバックが置き換えられます。新しい onHistoryChanged(history: NavigationEventHistory) コールバックを実装して、更新を単一の NavigationEventHistory オブジェクトとして受け取ります。(I23e0bb/444734264
  • 新しいグローバル NavigationEventDispatcher.history StateFlow を導入します。この汎用的でないフローにより、オブザーバーはナビゲーション スタックの変更のみをサブスクライブでき、ジェスチャーの進行中も安定した状態を維持できます。これは transitionState のカウンターパートです。(I1db10b/444734264
  • 新しいグローバル NavigationEventDispatcher.transitionState StateFlow を導入します。この非汎用フローにより、オブザーバーは履歴とは別に、物理ジェスチャーの状態(Idle/InProgress)のみをサブスクライブできます。(I171fab/444734264
  • NavigationEventHistoryState クラスを紹介します。これは、ジェスチャーの状態とは別に、ナビゲーション情報の履歴を観察するためのコア API として機能します。(I81ca5b/444734264
  • NavigationEvent@Immutable としてマークされるようになり、Compose Compiler で再コンポーズを最適化できるようになりました。(If78c7b/444734264
  • navigationevent-compose ハンドラ API が更新されました。NavigationEventHandlerNavigationBackHandler(およびバリアント)が、ホイストされた NavigationEventState を受け取る新しいオーバーロードをサポートするようになりました。(currentInfo を受け取る)シンプルなオーバーロードは保持され、内部でこの新しい状態モデルを使用するようになりました。(Ic3251b/444734264
  • 新しい @Stable NavigationEventState<T> 状態ホルダーを navigationevent-compose ライブラリに追加します。このオブジェクトはローカル履歴とローカル ジェスチャーの状態を組み合わせたもので、rememberNavigationEventStateNavigationEventHandler の間の主なリンクとなります。(Ifb69fb/444734264
  • NavigationEventHandler に新しいパブリックな読み取り専用の transitionState: TransitionState プロパティを追加します。ハンドラは独自の遷移状態を維持するようになり、外部システムがこれを監視できるようになりました。(I9acd2b/444734264
  • 新しい TransitionState 密封クラスを導入します。これは、ナビゲーション履歴とは別に、ジェスチャーの状態を監視するためのコア API として機能します。(Id4bebb/444734264
  • currentInfobackInfoforwardInfoNavigationEventHandler の公開読み取り専用プロパティとして公開します。(Ia7636b/444734264
  • NavigationEventHandler の実装では、ベース コンストラクタに initialInfo: T 値を指定する必要があります。(Idcfeab/444734264
  • OnBackInvokedInput は、OnBackInvokedOverlayInput または OnBackInvokedDefaultInput に置き換えます。(I5323fb/428948766
  • NavigationEventState@Immutable としてマークします。これにより、この状態を監視するコンポーザブルが再コンポーズを正しくスキップできるようになり、Compose のパフォーマンスが向上します。(I399c8
  • NavigationEventInfo.NotProvided の名前を NavigationEventInfo.None; に変更し、参照を更新します。動作の変更はありません。(I5e2d4
  • NavigationEventInfo@Immutable としてマークされるようになり、Compose Compiler で再コンポーズを最適化できるようになりました。(I7c112
  • 戻る操作の完了フォールバック用の楽しいインターフェースで Java のエルゴノミクスを改善しました。(I8a860
  • onHasEnabledHandlerChangedonHasEnabledHandlersChanged に変更しました。これにより、コールバックは 1 つのハンドラだけでなく、すべてのハンドラの有効状態をまとめてレポートすることが明確になります。(I1af61b/443711297
  • NavigationEventDispatcher; から hasEnabledHandler() を削除し、代わりに NavigationEventInput.onHasEnabledHandlersChanged を使用します。(Idef72b/443711297
  • NavigationEventInputonInfoChanged コールバックを追加して、ナビゲーション履歴の変更をリスナーに通知します。これにより、現在、戻る、進むのスタックの完全なコンテキストが提供され、入力がコンテキスト情報に反応できるようになります。(I69a8bb/443282983
  • NavigationEventswipeEdge@IntDef にします(Icee54b/443950342
  • NavigationEventDispatcher.addInputpriority パラメータを追加して、ディスパッチャを 1 つの優先度にスコープします。これにより、onHasEnabledCallbacksChanged などのイベントは、その優先度のコールバックが変更された場合にのみ発生するようになります。(I3e488b/443711297
  • わかりやすくするため、NavigationEventDispatcher パラメータの名前を parentDispatcher から parent に変更しました。(Id4f1fb/443801782
  • Java ユーザー向けに NavigationEventPriority を削除し、@IntDef を追加しました(I10a9fb/440514265
  • ナビゲーション ハンドラ契約を適用します。NavigationEventHandlerisBackEnabled または isForwardEnabledtrue に設定している場合は、それぞれ onBackCompleted または onForwardCompleted をオーバーライドする必要があります。デフォルトの実装で例外がスローされるようになり、サイレント障害が防止されます。(I17c62
  • ナビゲーション イベント ハンドラを追加する際に、有効な優先度の値を強制します。サポートされていない優先度で addHandler を呼び出すと、IllegalArgumentException がスローされるようになり、すべてのターゲット プラットフォームで誤った使用方法に対するフィードバックがすぐに提供されるようになりました。(I3c474

バグの修正

  • addHandler をべき等にします。重複する登録は無視します。(I052aab/444734264
  • 再コンポーズ中に NavigationEventState プロパティの同期を維持します。(Ib3b4db/444734264
  • NavigationEventInputs が登録直後に現在のコンテキスト情報(現在、戻る、進む)を受け取るようにします。(Ie65bfb/443282983

バージョン 1.0.0-alpha08

2025 年 9 月 10 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha08 がリリースされました。バージョン 1.0.0-alpha08 にはこれらの commit が含まれています。

新機能

  • Flow ベースのハンドラを置き換えるラムダベースの NavigationEventHandler API を導入します。フローを収集する代わりに、シンプルなコールバックで戻るジェスチャーと進むジェスチャーを処理し、ボイラープレートを減らしてキャンセルに関する問題を回避します。NavigationBackHandlerNavigationForwardHandler を対象のコンビニエンス API として提供します。Flow ベースの NavigationEventHandler を削除し、新しいコールバックに移行します。(I23bacb/436248277
  • パッシブ リスナーが、結合された戻る情報を通じて完全なナビゲーション バックスタックにアクセスできるようにします。UI が最上位のコールバックに限定されるのではなく、プレビューとネストされたナビゲーション履歴をレンダリングできるようにします。(I7a510b/436248277
  • 明示的な back/current/forward モデルを導入して、ナビゲーションの状態を明確にし、ネストされたハンドラによる forward ナビゲーションをサポートします。(Ib86dab/420443609
  • onForward* メソッドと isForwardEnabledNavigationEventCallback に追加します。(Ic100fb/436248290
  • NavigationEventInput に「進む」ナビゲーションのサポートを追加します。(I5734b

API の変更

  • TestNavigationEventCallback を使用して、前方ナビゲーション イベントのテストを有効にします。isForwardEnabled フックと onForward* フックを使用します。(I21fb5b/420443609
  • NavEventonEvent* コールバックを onBack* に名前変更します。(I228b3b/436248290
  • SwipeEdge をインライン クラスに変換します。(Id5e01
  • navigationevent ライブラリを Java と相互運用できるようにします。すべての公開 API に Java コードから完全にアクセスできるようになり、混合言語プロジェクトや Java 専用プロジェクトへのシームレスな統合が可能になりました。(Ibc944I5465fI9fb1eb/440532890b/443040294
  • NavigationEventCallback の名前を NavigationEventHandler に変更して、API ロールを明確にします。この変更により、マルチステージ ナビゲーション ジェスチャーを処理するというクラスの目的がより明確になります。対応する addCallback メソッドは addHandler になりました。(I2492ab/443040331

バグの修正

  • 進む操作で戻るフォールバックが実行されないようにします。(I74814b/436248290
  • 予測型「進む」ナビゲーションのサポートを追加しました。NavigationEvent API が「戻る」ジェスチャーと「進む」ジェスチャーの両方を処理するようになり、両方のナビゲーション方向で一貫したアニメーションが可能になりました。(Idc98cb/436248290
  • NavigationEventDispatcherOwner が削除されたときに再コンポーズ中に IllegalStateException がクラッシュするのを防ぎます。(Iff50cb/412629020
  • パッシブ リスナーは、結合された戻る情報を通じて完全なナビゲーション バックスタックにアクセスできるようになりました。これにより、UI は最上位のコールバックに限定されることなく、プレビューとネストされたナビゲーション履歴をレンダリングできます。(I7a510b/436248277

バージョン 1.0.0-alpha07

2025 年 8 月 27 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha07 がリリースされました。バージョン 1.0.0-alpha07 には、これらの commit が含まれています。

API の変更

  • NavigationEventDispatcher.onHasEnabledCallbacksChanged を削除しました。(I50e97
  • NavigationEventCallback.onEventCompleted() を抽象化しました。(I36b38
  • NavigationEventCallback#on* メソッドを protected に変更します。呼び出しコードを更新して、それらをオーバーライドします。(I6b691
  • DirectNavigationEventInput 関数の名前を変更しました。(Iffb62
  • NavigationEventInput.onAttachonAdded に変更しました。(I2d0b8
  • NavigationEventInput.onDetachonRemoved に変更しました。(I2d0b8
  • NavigationEventInputHandlerNavigationEventInput に変更しました。(I676a4
  • NavigationEventInput.onHasEnabledCallbacksChanged@EmptySuper を追加しました。(If9853
  • NavigationEventInputHandleronAttach を実装します。(I03648
  • NavigationEventInputHandleronDetach を実装します。(I03648
  • 作成時にデフォルトの NavigationEventCallback を有効にします。(Ic0188
  • NavigationEventInput.addOnHasEnabledCallbacksChangedCallbackNavigationEventInput.onHasEnabledCallbacksChanged に置き換えました。(I64e93
  • NavigationEventDispatcher.addInput にメインスレッドを要求します。(Ic2930
  • NavigationEventDispatcher.removeInput にメインスレッドを要求します。(Ic2930
  • Dispatcher.addOnHasEnabledCallbacksChangedCallback を削除しました。これは Dispatcher.onHasEnabledCallbacksChanged に置き換えられます。(Ida3e3b/436530096

バグの修正

  • すでにアタッチされているハンドラを追加したり、アタッチされていないハンドラを削除したりすると、ライフサイクル ロジックが正しくトリガーされないバグを修正しました。(I9e47b

バージョン 1.0.0-alpha06

2025 年 8 月 13 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha06 がリリースされました。バージョン 1.0.0-alpha06 には、これらの commit が含まれています。

新機能

Passive Listeners API

任意のナビゲーション ホストからカスタム コンテキスト情報を渡して、UI の任意の場所からジェスチャーの状態変化を受動的にリッスンできるようになりました。これにより、予測型「戻る」やその他のジェスチャー駆動型ナビゲーションでコンテキスト認識型アニメーションが有効になります。

この機能は 2 つの部分で構成されています。

  1. 情報の提供 - NavigationEventInfo を使用してカスタムデータを渡します。
  2. Consuming State - dispatcher.stateNavigationEventState)を使用して、ジェスチャーの進行状況とコンテキストを観察します。
  • NavigationEventCallbacksetInfo(currentInfo, previousInfo) メソッドを公開し、1 回の呼び出しでジェスチャー コンテキストを設定できるようになりました(I1d5e7b/424470518)。
  • NavigationEventHandlercurrentInfopreviousInfo を受け入れる新しいオーバーロードを追加し、Compose アプリでコンテキストを提供するプライマリ API にします(I6ecd3b/424470518)。

例:

  data class MyScreenInfo(val screenName: String) : NavigationEventInfo

  NavigationEventHandler(
      enabled = true,
      currentInfo = MyScreenInfo("Details Screen"),
      previousInfo = MyScreenInfo("Home Screen")
  ) { /* Handle back completion */ }
  • NavigationEventDispatcherdispatcher.statedispatcher.getState<T>() を公開するようになりました(If7faeIa90cab/424470518)。これらの StateFlow ベースの API を使用すると、UI はイベントを直接処理することなく、ジェスチャーの進行状況とコンテキスト データを監視できます。

例:

  val gestureState by LocalNavigationEventDispatcherOwner.current!!
      .navigationEventDispatcher
      .state
      .collectAsState()

  val progress = gestureState.progress // Returns latestEvent.progress or 0F

  when (val state = gestureState) {
      is InProgress -> {
          val toScreen = state.currentInfo as MyScreenInfo
          val fromScreen = state.previousInfo as MyScreenInfo
          println("Navigating from ${fromScreen.screenName} to ${toScreen.screenName}")
      }
      is Idle -> { /* Idle state */ }
  }
  • 進行中の場合は latestEvent.progress を、それ以外の場合は 0F を返す NavigationEventStateprogress プロパティを追加します(I7b196)。

    val progress = state.progress
    
  • NavigationEventDispatcherOwner コンポーザブルを追加して、NavigationEventDispatcher インスタンスを階層的に作成、リンク、破棄します。ディスパッチャーの有効状態の動的制御と自動クリーンアップを有効にします。

    @Composable
    fun Sample() {
        NavigationEventDispatcherOwner(enabled = true) {
            val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current
        }
    }
    

API の変更

  • isPassthrough パラメータが NavigationEventCallback から削除されました。(I99028b/424470518
  • NavigationEventState コンストラクタが internal になりました。テストでは、DirectNavigationEventInputHandler を介して状態(デフォルトは Idle)を更新します。handleOnStarted または handleOnProgressed を呼び出して状態を InProgress に設定し、handleOnCompleted または handleOnCancelled を呼び出して Idle に戻します。NavigationEventInfo を更新するには、NavigationEventCallback.setInfo を使用します。(I93dcab/424470518
  • NavigationEvent にデフォルト パラメータを追加して、インスタンス化を容易にし、テストを簡素化しました。これは TestNavigationEvent の代わりに使用する必要があります。(I5dc49I232f4
  • 特定の現在/以前の状態のナビゲーション イベントをテストするための TestNavigationEventCallback を追加しました。(Idd22eb/424470518
  • NavigationEventInputHandler が抽象クラスになり、以前の AbstractNavigationEventInputHandlerDirectNavigationEventInputHandler の実装に置き換えられました(Iadde5Ifed40I3897cb/432616296b/435416924
  • NavigationEventInputHandlersend* 関数の接頭辞の名前が handle* に変更されました。(Iffcaf
  • OnBackInvokedInputHandler が新たに abstract NavigationInputHandler を拡張するようになりました。(Ib45aa
  • NavigationEventDispatcherOwner を変更し、親ディスパッチャーを必須にしました。ルート ディスパッチャーを作成するには、null を明示的に渡す必要があります。(Ia6f64b/431534103

バグの修正

  • NavigationEventDispatcher.dispose() でコレクションのコピーを回避することで効率を改善しました。(I4ab09
  • NavigationEventHandler が有効状態の変更に正しく応答しない問題を修正しました。(Ia5268I19becI5be5cb/431534103

ドキュメントの更新

  • NavigationEvent の KDoc を拡張し、統合イベント ラッパーとしての役割と、さまざまなナビゲーション タイプ(ジェスチャー、クリック)での詳細プロパティの動作を明確にしました。(I91e8d
  • コールバックの順序に関する動作を明確にするため、Compose API(BackHandlerPredictiveBackHandlerNavigationEventHandler)のシステム バック処理に関するドキュメントを更新しました。(I7ab94、)

依存関係の更新

  • NavigationEvent が Compose Runtime 1.9.0-beta03 に依存するようになり、navigationevent-compose アーティファクトがすべての KMP ターゲットをサポートできるようになりました。(Ia1b87

バージョン 1.0.0-alpha05

2025 年 7 月 30 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha05 がリリースされました。バージョン 1.0.0-alpha05 には、これらの commit が含まれています。

親子階層のサポート:

NavigationEventDispatcher に親ディスパッチャーと子ディスパッチャーを設定して、階層ツリー構造を形成できるようになりました。これにより、UI の構造階層をチェーンされたディスパッチャーで反映することで、複雑な Compose UI コンポーネント間でナビゲーション イベントをより柔軟に伝播して管理できるようになります。(I194ac

  // Create a parent dispatcher that will manage navigation events at a higher level.
  val parentDispatcher = NavigationEventDispatcher()

  // Create a child dispatcher linked to the parent, forming a hierarchy.
  val childDispatcher = NavigationEventDispatcher(parentDispatcher)

階層型 isEnabled プロパティを使用すると、ディスパッチャをトップダウンで制御できます。ディスパッチャで isEnabledfalse に設定されている場合、そのすべての子孫ディスパッチャが自動的に無効になります。この機能により、ナビゲーション イベント システムのブランチ全体を効率的にオフにできます。(I9e985

  // Disabling the child dispatcher disables all its callbacks and any of its children recursively.
  childDispatcher.isEnabled = false

また、NavigationEventCallbackisEnabled プロパティは、関連付けられたディスパッチャーの有効状態を尊重するようになりました。つまり、コールバック自体とそのディスパッチャー(その祖先を含む)の両方が有効になっている場合にのみ、コールバックが有効と見なされます。これにより、コールバックの有効化に対する階層的な制御の一貫性が確保されます。(I1799a

  // Create a test callback and add it to the child dispatcher.
  val callback1 = TestNavigationEventCallback(isEnabled = true)
  childDispatcher.addCallback(callback1)

  // Since the childDispatcher is disabled, the callback is effectively disabled as well.
  assertThat(callback1.isEnabled).isFalse()

ディスパッチャーとその子を適切にクリーンアップするための新しい dispose() メソッドが導入されました。dispose() を呼び出すと、メモリリークを防ぐためにリスナーが停止し、すべての子ディスパッチャーが再帰的に破棄され、ディスパッチャーに登録されているすべてのコールバックが削除され、親とのリンクが解除されます。これにより、ディスパッチャーが不要になったときにリソースが正しく解放されることが保証されます。(I9e985

  // Dispose the child dispatcher to clean up resources.
  childDispatcher.dispose()

破棄されたディスパッチャーでパブリック メソッドが呼び出されると、IllegalStateException がすぐにスローされます。これにより、サイレント障害を防ぎ、開発中に不適切な使用を特定できます。(Ic2dc3

  val callback2 = TestNavigationEventCallback()

  // Attempting to use a disposed dispatcher will throw an exception.
  assertThrows<IllegalStateException> {
      childDispatcher.addCallback(callback2)
  }

注: aosp/3692572 で、Compose UI 内の子ディスパッチャーを自動的に管理する新しい NavigationEventDispatcherOwner コンポーザブルを導入します。ただし、この変更は現在のリリース カットには含まれておらず、次のリリース カットで予定されています。

Navigation テスト ライブラリ

  • navigationevent ライブラリ専用のテスト ユーティリティを提供する navigationevent-testing モジュールを追加しました。(0e50b6
  • テスト用の TestNavigationEventCallback 偽ユーティリティ クラスを追加します。コールバック メソッドの呼び出しを記録し、受け取った NavigationEvent アイテムを保存して検証をサポートします。(4a0246
  • TestNavigationEvent フェイク ユーティリティ関数を追加して、デフォルト値で NavigationEvent インスタンスを作成し、ナビゲーション イベント処理の単体テストを簡素化します。(3b63f5
  • テスト用の TestNavigationEventDispatcherOwner 偽ユーティリティ クラスを追加します。フォールバックと有効状態変更イベントの数をトラッキングし、テストでのインタラクション検証をサポートします。(c8753e

API の変更

  • NavigationEventInputHandlerandroidMain から commonMain に移動して、KMP 共通コードで使用できるようにしました。イベントをディスパッチするための新しい public send* メソッドを追加しました。NavigationEventDispatcher のディスパッチ関数を public から internal に変更しました。ユーザーはイベントを送信する際に NavigationEventInputHandler を使用する必要があります。(Ia7114
  • NavigationInputHandlerOnBackInvokedInputHandler に変更しました。(I63405

バグの修正

  • 中間リストの割り当てを回避し、コールバック ディスパッチのパフォーマンスを改善することで、オーバーヘッドを削減するために NavigationEventDispatcher をリファクタリングしました。(I82702I1a9d9
  • NavigationEventtouchXtouchYprogress フィールドに @FloatRange アノテーションを追加して、コンパイル時に有効な値の範囲を適用し、API の安全性を向上させます。(Iac0ec

バージョン 1.0.0-alpha04

2025 年 7 月 2 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha04 がリリースされました。バージョン 1.0.0-alpha04 にはこれらの commit が含まれています。

バグの修正

  • implementedInJetBrainsForknavigationevent-compose に変更し、Compose の慣例に沿って commonStubs ターゲットを追加しました。JetBrains からリクエストされた変更。(f60c79
  • Kotlin/Native 用の Compose コンパイラ プラグインの適用を修正し、スタブが正しく生成されるようにしました。公開 API や動作には影響しません。(1890c9

バージョン 1.0.0-alpha03

2025 年 6 月 18 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha03 がリリースされました。バージョン 1.0.0-alpha03 にはこれらの commit が含まれています。

新機能

  • navigationevent ライブラリで Jetpack Compose の機能をサポートする新しい navigationevent-compose モジュールを導入しました。(980d78
  • NavigationEvent Compose に新しい LocalNavigationEventDispatcherOwner ローカル コンポジションが追加されました。現在の合成中に使用可能かどうかを判断しやすくするための null 許容値を返します。基になるオーナーが見つからない場合、NavigationEventHandler でエラーがスローされるようになりました。(62ffda
  • NavigationEvent Compose に、(予測型「戻る」ジェスチャー)イベントを処理するための新しい NavigationEventHandler コンポーザブルが追加されました。c42ba6 で提供する一時停止ラムダで収集する必要がある NavigationEvent オブジェクトの Flow を提供します。
NavigationEventHandler { progress: Flow<NavigationEvent> ->
  // This block is executed when the back gesture begins.
  try {
    progress.collect { backEvent ->
      // Handle gesture progress updates here.
    }
    // This block is executed if the gesture completes successfully.
  } catch (e: CancellationException) {
    // This block is executed if the gesture is cancelled
    throw e
  } finally {
    // This block is executed either the gesture is completed or cancelled
  }
}

API の変更

  • NavigationEventCallback は一度に 1 つの NavigationEventDispatcher にのみ登録できるようになりました。複数のディスパッチャーに追加すると、IllegalStateException がスローされます。この動作は、複数のディスパッチャを許可する OnBackPressedDispatcher とは異なります。(e82c19
  • isPassThroughval にして、ナビゲーション中のミューテーションを防ぎ、NavigationEvent のディスパッチが中断されないようにしました。(I0b287

バージョン 1.0.0-alpha02

2025 年 6 月 4 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha02 がリリースされました。バージョン 1.0.0-alpha02 にはこれらの commit が含まれています。

API の変更

  • NavigationEventDispatcher のセカンダリ コンストラクタをデフォルト引数に置き換えます。(I716a0
  • NavigationEventCallback から優先度プロパティを削除します。代わりに、優先度を NavigationEventDispatcher.addCallback() に渡します。(I13cae

バグの修正

  • closeable の内部リストを同時に変更したために NavigationEventCallback.remove() が呼び出された場合に発生する可能性のある ConcurrentModificationException を修正しました。(b/420919815

バージョン 1.0.0-alpha01

2025 年 5 月 20 日

androidx.navigationevent:navigationevent-*:1.0.0-alpha01 がリリースされました。バージョン 1.0.0-alpha01 にはこれらの commit が含まれています。

新機能

  • androidx.navigationevent ライブラリは、システムバックと予測型「戻る」を処理するための KMP ファースト API を提供します。NavigationEventDispatcher は、システム [戻る] イベントを受け取るために 1 つ以上の NavigationEventCallback インスタンスを登録するための共通 API として機能します。
  • このレイヤは、androidx.activity で以前にリリースされた API の下に位置し、上位レベルのコンポーネントで Activity API を使用したり、Android フレームワーク OnBackInvokedDispatcher API を直接使用したりする際の、より制約の少ない代替手段となることを目指しています。androidx.activity API は、Activity 1.12.0-alpha01 の一部として、Navigation Event API の上に書き直されました。