web-dev-qa-db-ja.com

MVVMを使用したナビゲーションandroid

Androids ViewModelクラスとナビゲーションコンポーネントを使用してフラグメント間を移動するアプリがあります。 ViewModelからのナビゲーションをどのように処理しますか?私はRxJavaを使用しており、フラグメントがナビゲーションイベントをリッスンし、その方法でナビゲーションをトリガーすることを考えていました。これを処理する通常の方法は何ですか?また、依存関係の注入にもDaggerを使用しています。

11

MVPを使用している場合、PはナビゲーションをトリガーするVのメソッドを呼び出すだけです。

MVVMでの同等のアプローチは、専用のobservable/listener/callbackを使用することです。RxJavaで行う場合は、PublishSubjectで駆動できます。これは、1回限りの要件を満たします。代わりに、サブスクライブする前に発行される可能性のあるイベントに応答する必要がある場合は、_BehaviorSubject<Optional<T>>_を使用してcreateDefault(absent<T>())で作成し、onNext(Optional.of(navigationObject))でトリガーしてからVMナビゲーションがいつ発生するかを知ってから、VMはonNext(absent())でクリアできます。

または、すべてを包括するredux/mviのような状態にしたい場合、ビューに受信/操作すると、ビューにどこかにナビゲートすることを示すプロパティを含むすべての状態を持ついくつかの状態クラスがありますVM完了したことを伝え、VMはナビゲーションなしで現在の状態と同じ状態に設定します。たとえば(Kotlin)state = state.copy(navigateToX = false)

3
Andrew Gallasch

SnackBarを使用したLiveData、ナビゲーション、その他のイベントに関するブログ投稿

Snackbarメッセージ、ナビゲーションイベント、ダイアログトリガーなど、一部のデータは1回だけ使用する必要があります。

ライブラリまたはアーキテクチャコンポーネントの拡張機能でこれを解決しようとする代わりに、設計上の問題として直面する必要があります。 イベントを州の一部として扱うことをお勧めします。

オブザーバー(つまり、NavControllerにアクセスできるフラグメント)が各ナビゲーションイベントを1回だけ受信することを保証する SingleLiveEvent クラスの使用について詳しく説明します。

もう1つの方法は、イベントを処理済みとして明示的にマークする必要がある「イベントラッパー」モデルを使用することです。

7
ianhanniballake