ディスパッチャを設定する

堅牢なナビゲーション システムを実装するには、アプリで「戻る」ジェスチャーやその他のナビゲーション シグナルを一元的に処理する必要があります。このページでは、NavigationEventDispatcher を使用して、これらのナビゲーション イベントをアプリ全体で調整、配信する方法について説明します。

NavigationEventDispatcher を宣言する

NavigationEventDispatcher は、NavigationEvent ライブラリの中心的なコンポーネントです。これは、戻る操作やナビゲーション遷移などのナビゲーション関連のイベントを、アプリ内の登録済みリスナーにディスパッチするイベントハブとして機能します。コンポーネントは、これらのイベントに登録して、ナビゲーションの変更やその他のシステム主導のナビゲーション アクションに対応できます。

NavigationEventDispatcher インスタンスは、NavigationEventDispatcherOwner を介して提供する必要があります。これにより、アプリのさまざまな部分が同じディスパッチャにアクセスし、一貫性のある調整された方法でナビゲーション イベントを監視できます。

class MyComponent: NavigationEventDispatcherOwner {
    override val navigationEventDispatcher: NavigationEventDispatcher =
        NavigationEventDispatcher()
}

ComponentActivity 内にいる場合は、独自のディスパッチャを実装する代わりに、提供されているディスパッチャを取得できます。

class MyCustomActivity : ComponentActivity() {
    fun addMyHandler() {
        // navigationEventDispatcher provided by the ComponentActivity
        navigationEventDispatcher.addHandler(myNavigationEventHandler)
    }
}

NavigationEventInput を追加する

ハンドラを登録したので、イベントを受信する準備が整いました。ただし、NavigationEventInput でイベントが生成されるソースを指定する必要があります。

NavigationEventInput は、未加工のシステム入力を受け取り、NavigationEventDispatcher に送信される標準の NavigationEvent に変換するプラットフォーム固有のコンポーネントです。

次の例は、NavigationEventInput のカスタム実装です。

public class MyInput : NavigationEventInput() {
    @MainThread
    public fun backStarted(event: NavigationEvent) {
        dispatchOnBackStarted(event)
    }

    @MainThread
    public fun backProgressed(event: NavigationEvent) {
        dispatchOnBackProgressed(event)
    }

    @MainThread
    public fun backCancelled() {
        dispatchOnBackCancelled()
    }

    @MainThread
    public fun backCompleted() {
        dispatchOnBackCompleted()
    }
}

次に、その入力をディスパッチャに渡します。

navigationEventDispatcher.addInput(MyInput())

dispose() を使用してリソースをクリーンアップする

動的 UI でメモリリークを防ぐには、作成されたすべての NavigationEventDispatcher インスタンスを、関連付けられたコンポーネントが破棄されたときに dispose() メソッドを使用して階層から明示的に削除する必要があります。

navigationEventDispatcher.dispose()

dispose() メソッドは、ディスパッチャとそのすべての子孫(子と孫)を繰り返し削除することで、カスケード クリーンアップを確実に実行し、関連するすべてのハンドラが共有システムから登録解除されるようにします。

ディスパッチャーの階層と制御

NavigationEventDispatcher は親子階層をサポートしているため、UI 内に深くネストされたコンポーネント(ネストされた NavHost やダイアログなど)をナビゲーション イベント処理に組み込むことができます。

子ディスパッチャを作成する

子ディスパッチャは、作成時に親ディスパッチャへの参照を渡すことで作成されます。階層内のすべてのディスパッチャは同じ NavigationEventProcessor を共有し、優先度に基づいてグローバルな後入れ先出し(LIFO)イベント順序を維持します。

階層的な有効化

ディスパッチャには isEnabled プロパティが含まれており、デベロッパーはハンドラのサブツリー全体を一度に有効または無効にできます。

親ディスパッチャが無効(isEnabled = false)になっている場合、その親に関連付けられているすべてのハンドラとその子ハンドラは、個々の有効状態に関係なく無視されます。