問題は非常に簡単です。問題は、ViewModels、LiveData、およびその他の関連する Lifecycle 対応のArchアプローチの使用に関連しています。
NavDrawerを使用して、内部でフラグメントを切り替えるアクティビティがあります。
また、画面に2つのフラグメントが同時に存在する場合もあります。これが主な問題です。 1つのフラグメントに、ネストされたFragments
(do n't ask why)を含むViewPagerがあります。他のフラグメントは、ユーザーがいくつかのアクションを実行したときに最初のフラグメントから情報を取得するだけです。これは、アクティビティビューモデルを共有するだけで実現できます。しかし、アプリ自体には多くのビジネスロジックがあり、さらに進むと、ビューモデルはますます大きくなります。
私が聞きたいこと-領収書やこれを修正する方法、またはプロジェクトの構造全体を修正することによってこれを克服する方法についてのルールではありません。私は、Android.Arch.lifecycleスタイル内のMVVMアプローチをマイニングのユースケースにどのように適用できるかについて提案をお願いしたいと思います。
フラグメント間でアクティビティビューモデルを共有するだけで、もっと複雑なものを見たことはありません。しかし、一般的に、それは治療法ではありません。
あなたがここで見ることができるもの-実際に混乱。ポイントは、すべてがActivityViewModel
を共有しているということです。 FirstFragmentからのConnections(aggregation)は、ViewPager
内のFirstFragment
がChildFragments
を開始しており、同じActivityViewModel
(kill me)を使用していることを意味します。その結果、全員が1つの共有ViewModelで作業しています。
私の提案は、レイヤーごとにViewModelを追加することです。したがって、Activity/Fragments/ChildFragmentsには独自のViewModelがあります。しかし、ここに何が表示されますか-次にどのように通信する必要があるか?
可能な解決策 :
その他の回避策-DB/SharedPrefs/Realm変更リスナーやイベントバスなど(私はこれには古すぎます:()。
ここにあなたの解決策!
上記のすべてが多くの設計原則を破っているので、どうすればよいですか?どうすればこの混乱から抜け出すことができますか? Uncle Bob
または別のsuperhero
が役立ちますか?
P.S。-まあ、UMLや他のグラフを作成することは私の得意ではありません。そのために残念。
P.P.S。-私は googlesamples を知っています。
まず、multipleViewModel
をsingleビュー。
ViewModelは、dataがどのように取得および操作しているかを考え、それらをグループ化します。それは自然に思えます。
あなたの場合、フラグメントとアクティビティのロジックが非常に似ている場合は、単一のViewModel
で十分だと思いますが、それは避けます。
私がやろうとしていることは、アクティビティのViewModel
を小さな部分に分割し、ViewModel
の適切なFragments
を再利用して、God ViewModel、または大体同じコードを別のViewModelで使用することもできません。
私が提案することあなたができることは、ユースケース全体に対して2つのViewModel
を処理することです。
1つ作るViewModel
MyActivityViewModel
activityレベルに関連するすべてのロジックを処理するとします。したがって、もしfragmentロジックがあなたのactivityに直接関連しているなら、以下のようにViewModel
を共有してください:
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class); // Like this in fragment.
&
ViewModelProviders.of(this).get(MyActivityViewModel.class); // Like this in activity.
これはactivityとfragmentの間で共通のViewModel
を共有します。
ViewModel
間でロジックを共有する必要がある場合、別のFirstFragment
があなたのケースでChildFragment
になります。
ここでViewModel
を共有できますFragmentViewModel
と言いましょう:
ViewModelProviders.of(this).get(FragmentViewModel.class); // Like this in FirstFragment which is having view pager.
&
ViewModelProviders.of(getParentFragment()).get(FragmentViewModel.class); // Like this in View pager fragments, getParentFragment() is First fragment in our case.
ただし、FirstFragmentの子フラグメントでは、次のようにアクティビティレベルMyActivityViewModel
を引き続き使用できます。
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class);