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

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

NavigationEventDispatcher を宣言する

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

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

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 は、未加工のシステム入力を受け取り、それを標準の NavigationEvent に変換して NavigationEventDispatcher に送信するプラットフォーム固有のコンポーネントです。

次の例は、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)になると、その親と子に関連付けられているすべてのハンドラは、個々の有効状態に関係なく無視されます。