2017-08-20 8 views
3

私は新しいAndroidアーキテクチャコンポーネント、特にViewModelの周りを頭で覆そうとしています。ViewModelsのスコープを正しく設定する方法は?

私の印象は、フラグメントが所有しているアクティビティーやフラグメントについて、そのアプリケーションのさまざまなコンテキストで使用できるようにすることです。例は、むしろ断片の所有者よりも、フラグメントに直接ViewModelにスコープを宣言することで、これを矛盾するように見える:

viewModel = ViewModelProviders.of(getActivity()).get(SomeViewModel.class); 

私はどこの両方共有し、マスター/詳細設定で、このフラグメントを使用できるようにしたいと思います同じ状態(すなわち、ViewModelインスタンス)、およびViewPager内で、すべてのフラグメントが別々の状態を必要とする(すなわち、別々のViewModelインスタンス)。私は、フラグメントの所有者がこのアプローチでサポートされていないような範囲を指定することを期待します。私が思いついた

回避策は、(マスター/詳細設定で例えば)、必要に応じて明示的にビューモデルの適用範囲を広げるために構成されたViewModelProviderにパスを任意になり、デフォルトで別々のviewmodelsを持つことができます:

final ViewModelProvider viewModelProvider; 
if (viewModelProviderOverride != null) { 
    viewModelProvider = viewModelProviderOverride; 
} else { 
    viewModelProvider = ViewModelProviders.of(this); 
} 

viewModel = viewModelProvider.get(SomeViewModel.class); 

この方法では、所有者は、複数のフラグメントが状態を共有するかどうかを決定できます。私はまだこれを完全には考えていませんが、それに近いものはドキュメント内に暗示されているように見えないので、それは一種の怪しいようです。私は何かが明らかに欠けているように感じる。

+0

'Fragment'インスタンスごとに異なる' ViewModel'が必要ですか? 'ViewModelProvider#get(String key、Class modelClass)'を使用してください。 – pskink

+0

@pskink少し不明なことがあるかもしれませんが、残念です。私の問題は、フラグメント内に 'ViewModelProviders.of(getActivity())'を付けると親アクティビティと結合し、別の場所でフラグメントをスタンドアロンで使用することを防ぐことです(つまり、 'ViewModelProviders.of(this)')。私は断片が、それが働いている国家を誰が所有しているのかを決定するべきかどうかについて疑問を呈しています。フラグメントの所有者(含まれているアクティビティまたは別の親フラグメント)は、この選択の責任を負います。これは物事を明確にしていますか? – jwueller

+0

'ViewModelProviders#of'メソッドは、ほとんどの場合に使用できるユーティリティであり、より多くの制御が必要な場合は、常に' ViewModelProvider'コンストラクタの1つを使用するか、 'ViewModelStoreOwner'インタフェースを渡すか(' 'ViewModelProvider.NewInstanceFactory'または' ViewModelProviders.DefaultFactory'のいずれかを使うことができるという欠点があります。これは、 'ViewModelProvider.Factory'を渡す必要があります。 – pskink

答えて

0

ViewModel」の状態がアクティビティの有効範囲になるようにすることを意味します。あなたが断片にアクティビティにスコープを適用したくない場合は、viewModel = ViewModelProviders.of(this).get(SomeViewModel.class);と呼ぶことができます。今度はあなたがすることはif (shareState)です。

関連する問題