2016-04-04 10 views
1

私は2回の注射でアクティビティを持っています。各注入されたコンポーネントだけでは動作しますが、注入の両方の次のエラーにつながる:ダガー2個のAndroid用マルチインジェクション

Error:(12, 10) error: android.app.Fragment cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. 
fr.daggertest.MainActivity.fragmentB 
[injected field of type: android.app.Fragment fragmentB] 

Error:(12, 10) error: android.app.Application cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. 
fr.daggertest.MainActivity.applicationA 
[injected field of type: android.app.Application applicationA] 

をしかし、彼らの両方がすでに注釈付き@Providesているので、私は間違っているものを見ないのですか?

MainActivity.java

public class MainActivity extends AppCompatActivity { 

@Inject 
Fragment fragmentB; 

@Inject 
Application applicationA; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // create component & inject... 
} 

モジュール&コンポーネント:

@Component(modules={ModuleA.class}) 
@Singleton 
public interface ComponentA { 
    void inject(MainActivity activity); 
} 

@Component(modules={ModuleB.class}) 
@Singleton 
public interface ComponentB { 
    void inject(MainActivity activity); 
} 

@Module 
public class ModuleA { 
    Application mApplication; 

    public ModuleA(Application application) { 
     mApplication = application; 
    } 

    @Provides 
    public Application provideApplication() { 
     return mApplication; 
    } 
} 

@Module 
public class ModuleB { 
    Fragment mFragment; 

    public ModuleB(Fragment fragment) { 
     mFragment = fragment; 
    } 

    @Provides 
    public Fragment provideFragment() { 
     return mFragment; 
    } 
} 
+0

あなたは 'Activity'を提供するメソッドを提供しておらず、' Fragment'と 'Application'だけを提供しています。また、あなたは "コンポーネントを作成して注入する"コードを投稿することができますか? – Pelocho

+0

申し訳ありませんがタイプミスで、コードを編集しました。 "create component&inject"コードはコメントアウトされていますが、これはコンパイルエラーの原因ではありません。 –

+0

実際、可能です。私の答えを確認してください – Pelocho

答えて

1

あなたはComponent@Inject

で注釈を付け、すべての依存性を提供できることを確認します Componentダガー2で Activityを注入しようとした場合

今すぐあなたのComponents(probabl y)は、2つの依存関係のうちの1つのみを提供します。一方の成分を確認し、他の1に依存またはそれらのいずれかが別の可能な解決策はこれにあなたのComponent秒を変更することができ、両方のModules

かかります

@Singleton 
public interface ComponentA { 
    Application getApplication(); 
} 

@Component(modules={ModuleB.class}) 
@Singleton 
public interface ComponentB { 
    Fragment getFragment(); 
} 

をし、これにあなたの注入コードを変更:

ComponentA componentA = ... 
ComponentB componentB = ... 
applicationA = componentA.getApplication(); 
fragmentB = componentB.getFragment(); 
+0

彼らはすでにスコープの異なる別のコンポーネント(簡単にするために例には示されていません)に依存しているため、他のコンポーネントに依存させることはできません。それらのうちの1つを両方のモジュールにすることは、全く無関係なので間違っているように見える。 –

+0

その場合、おそらくフィールドを「手動で」注入する必要があります。私の編集をチェックする – Pelocho

関連する問題