2016-08-27 9 views
0

最初のものと同じクラスに何かを注入する2つ目のDagger 2コンポーネントを作成しようとすると、コンパイルエラーが発生します。それは許されないのですか?私はそうではないと言う文書は見つけられていない。Android Dagger 2のコンパイルエラー

モジュール1:

@Module 
public class NavModule { 

    Context context; 

    public NavModule(Context context){ 
     this.context = context; 
    } 

    @Provides @Named("nav") 
    public List<NAV_ACTIONS> provideNavActions() { 
     // Do some stuff 
    } 
} 

コンポーネント1:

@Component(modules = {NavModule.class}) 
public interface NavComponent { 

    void inject(MainActivity activity); 
    void inject(AbstractHomeFragment fragment); 
} 

モジュール2:すべてはまだ罰金コンパイルこの時点で

@Module 
public class OtherModule { 

    Context context; 

    public OtherModule(Context context){ 
     this.context = context; 
    } 

    @Provides 
    public Object provideSomething(){ 
     return null; 
    } 
} 

。私は、コンポーネント2を追加すると、それが壊れる:ここ

@Component(modules = {OtherModule.class}) 
public interface OtherComponent { 

    void inject(MainActivity activity); 
    void inject(AbstractHomeFragment fragment); 
} 

はエラーです:

Error:(14, 10) error: @javax.inject.Named("nav") java.util.List<NAV_ACTIONS> cannot be provided without an @Provides- or @Produces-annotated method. 
@javax.inject.Named("nav") java.util.List<NAV_ACTIONS> is injected at 
com.company.common.MainActivity.navActions 
com.company.common.MainActivity is injected at 
com.company.common.dependency.OtherComponent.inject(activity) 

Error:(15, 10) error: @javax.inject.Named("home") java.util.List<com.company.common.NAV_ACTIONS> cannot be provided without an @Provides- or @Produces-annotated method. 
@javax.inject.Named("home") java.util.List<com.company.common.NAV_ACTIONS> is injected at 
com.company.common.views.AbstractHomeFragment.homeActions 
com.company.common.views.AbstractHomeFragment is injected at 
com.company.common.dependency.OtherComponent.inject(fragment) 

E:\Development\Repositories\PropertyForce\PropertyForce_Android\app\src\main\java\com\company\common\MainActivity.java 
Error:(50, 47) error: cannot find symbol class DaggerNavComponent 
Error:(50, 47) error: cannot find symbol class DaggerNavComponent 

E:\Development\Repositories\PropertyForce\PropertyForce_Android\app\src\main\java\com\company\common\views\AbstractHomeFragment.java 
Error:(29, 47) error: cannot find symbol class DaggerNavComponent 
Error:(29, 47) error: cannot find symbol class DaggerNavComponent 

はこちらMainActivityからダガー関連のものです。エディタにエラーは表示されません。

import com.company.common.dependency.DaggerNavComponent; 
import com.company.common.dependency.NavComponent; 
import com.company.common.dependency.NavModule; 
// ... 
@Inject @Named("nav") List<NAV_ACTIONS> navActions; 
// ... 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     NavComponent navComponent = DaggerNavComponent.builder().navModule(new NavModule(this)).build(); 
     navComponent.inject(this); 
// ... 

AbstractHomeFragmentは非常に似たようなことをしています。あなたは複数持つことができます -

@Component(modules = {OtherModule.class, NavModule.class}) 
public interface OtherComponent { 

    void inject(MainActivity activity); 
    void inject(AbstractHomeFragment fragment); 
} 

編集:

答えて

3

は、あなたは、あなたのアプリケーションに宣言した単一コンポーネントで注入されたモジュールのリストにまとめてNavModuleOtherModuleを追加する必要がありますあなたはApplication.classファイルでそれらを初期化する必要があります。同じクラスに2つの異なるモジュールを注入しているので、ここではシングルで使用することをお勧めしました。

希望するもの:

+0

私は見る!だから、私が正しく理解していることを確認するために、あなたはアプリケーション内に 'Component'を1つだけ持っていると思いますか?そして、 "アプリケーション"によってあなたはアプリケーションを意味し、 'android.os.Application'サブクラスではありません、そうですか? – nasch

+0

別の質問 - 'Component'オブジェクトを作成するときに、私は' Module'を渡します。したがって、2つの異なるモジュールから注入されるものを得るためには、 'Module'インスタンスごとに2つの' Component'インスタンスを作成する必要がありますか? – nasch

+2

私はansを編集しました。クラスファイルでビルダーを呼び出す必要はありません。これは、アプリケーションファイルで行います。 @Injectを使うだけです。私のデモアプリケーションで、以下のことを確認できます:https://github.com/code-crusher/android-demos/tree/master/Dagger2 –

関連する問題