2016-08-10 9 views
4

私は現在、Dagger 2を解明しようとしています.App、User、Activity、Fragmentの4つのスコープを設定しようとしています。ユーザーとアクティビティのコンポーネントは、アプリケーションのサブコンポーネントです。フラグメントは、依存関係としてアクティビティーを持つコンポーネントです。スコープを使用する場合の依存性注入の順序

私のUserSettingsActivityは、(ActivityModuleによって提供される)ツールバーとUserProfile(UserModuleによって提供される)を必要とします。私はデータベースから要求するまでUserProfileを取得しませんが、ツールバーはすぐに提供できます。したがって、実行される注入の順序は、まずActivityComponentに、次にUserComponentになります。私は2つの@Injectフィールドを持っています.1つはツールバー用で、もう1つはアクティビティ内のUserProfile用です。私は、ダガーが依存関係が異なるモジュールから来ていることを知っていることを期待していましたが、ActivityComponentに注入されたときにUserProfileを提供することはできないと不平を言うようです。明らかにActivityModuleでは提供できませんが、なぜUserProfileがUserModuleによって提供される接続をしていないのですか?

答えて

4

私の知る限り、Dagger-2は「部分注入」をサポートしていません。 myComponentthisのすべて@Inject注釈付きのメンバーを提供することができない場合ので

、あなたがmyComponent.inject(this)を呼び出し、ダガー-2でエラーが発生します。

私はこの制限を回避するには、2つの方法を参照:

  1. UserProfileから@Inject注釈を削除UserComponentにパブリックメソッドを介しUserProfileを露出させUserComponentを使用する準備ができたときにそれを手動で注入します。これと類似したもの:userProfile = userComponent.getUserProfile()
  2. UserComponentはデータの取得に依存しません。 UserComponentを使用してToolbarといくつかのUserProfileProviderを同時に注入すると、からUserProfileを取り出すことができます。

私は個人的に第2のアプローチが良い選択だと思います。 DIライブラリは、構築時にオブジェクトの依存関係を満たすために使用する必要があります。 AndroidではActivityFragmentは作成できませんので、onCreate()onAttach()onCreateView()などでDIを実行しますが、DIライブラリを使用してアプリケーションのフローを制御する必要があるわけではありません。

+0

あなたはこのような質問を見ていただけますか?私は立ち往生している:| –

2

サブコンポーネントは、あなたのケースで継承(継承)と同様です。ユーザーコンポーネントとアクティビティコンポーネントは、アプリケーションコンポーネントを拡張しますが、ユーザーコンポーネントとアクティビティコンポーネントとの間には関係がありません。

サブコンポーネントは、他のサブコンポーネントに依存することはできません。

代わりに、アクティビティコンポーネントをユーザーコンポーネントのサブコンポーネントとして作成することができます。これにより、ユーザーを切り替える柔軟性も得られます。

+0

この質問をご覧ください。私は詰まっているhttps://stackoverflow.com/q/45189295/5214893 –