web-dev-qa-db-ja.com

アクティビティにスコープを設定せずに、フラグメント間でビューモデルを共有しますか?

新しいナビゲーションアーキテクチャコンポーネントを使用すると、画面に複数のフラグメントを持つnavhostとして単一のアクティビティがあります。現在、ユーザーがボタンをクリックすると別のフラグメントが開き、選択できる国のリストが表示されるEditProfileFragmentがあります。その国の選択結果をEditProfileFragmentに戻したいとしましょう。一般的な考え方は、すべての「プロファイルの編集」アクションに対して単一のEditProfileViewModelを使用することです。

  1. 選択した国をこれらのフラグメント間で共有するにはどうすればよいですか?共有ビューモデルを使用することを考えていますが、ユーザーが「プロファイルの編集」フローを完了したときにそれを保持したくないため、アクティビティにスコープすることを躊躇しています。

  2. 私が考慮すべき他のクリーン/推奨アプローチはありますか?たぶん、一時的にその値を保持するシングルトンですか?

10
papageorgiouk

将来の参考のためにこれをどのように解決したかについての私自身の質問に答えます:

ViewModel-View(controller)/ Fragment間の1対1の関係を維持したかったので、このような場合に「一時状態」オブジェクトを保持するUserRepositoryを使用しました。

0
papageorgiouk

確かに共有ビューモデルの方が簡単ですが、あなたが言ったように、単純な情報交換のためにビューモデルをより高いコンテキストにスコープするなどの他の懸念が伴います。

IMHO共有ビューモデルは、特定のシナリオでは悪いアプローチではありません。私は5つのタブがあるアプリに取り組んでいましたが、最初のタブは2番目と3番目のタブの要約のようなものでした。データを再利用し、対応するビューにアダプターが表示するアイテムの数を変更するだけで、ロジックが再利用されていたため、共有ビューモデルを使用することをお勧めします。

プロフィールとプロフィール編集ページに共通のロジック/アイテムがあるようです。いくつあるかはわかりませんが、これら2つの間でビューモデルを共有するだけでは不十分だと思われる場合は、ビューモデルを使用しているからといって、それらを使用して共有/保存/受け渡しする必要があるわけではないことを覚えておいてください。データ。例えば ​​:

  • 取得したデータを含む前のフラグメントに移動します。
  • 「プロファイル」を永続性に保存し、保存内容を変更できます。プロファイルのビューモデルが(再)作成されると、永続性から最新の値が取得されます。
  • サーバーでプロファイルを直接更新し、プロファイルで再度フェッチすることができます。
  • 上記の2つを組み合わせることができます。
2
Mel