从多个组件注入现场

时间:2016-07-19 06:12:53

标签: android dagger-2

Dagger2可以从下面的两个模块中注入吗?

public class MyActivity extends Activity {

  @Inject ProvidedByOne one;
  @Inject ProvidedByTwo two;

  public void onCreate(Bundle savedInstance) {
        ((App) getApplication()).getOneComponent().inject(this);
        ((App) getApplication()).getSecondComponent().inject(this);
    } 
}

我有两个独立的模块,无法使其正常工作。我收到了错误:

  

错误:(16,10)错误:com.test.dagger.module.TwoModule.Two不能   没有@Inject构造函数或@ Provide-或者提供   @ Produces-annotated方法。 com.test.activity.MoreActivity.two   [注入字段类型:com.test.dagger.module.TwoModule.Two two]

     

错误:(16,10)错误:com.test.dagger.module.OneModule.One不能   没有@Inject构造函数或@ Provide-或者提供   @ Produces-annotated方法。 com.test.activity.MoreActivity.one   [注入类型的字段:com.test.dagger.module.OneModule.One one]

public class MoreActivity extends SingleFragmentActivity {

    @Inject OneModule.One one;
    @Inject TwoModule.Two two;

    @Override
    protected Fragment createFragment() {

        ((App)getApplication()).getOneComponent().inject(this);
        ((App)getApplication()).getTwoComponent().inject(this);

        return SimpleFragment.newInstance(MoreActivity.class.getSimpleName());
    }
}

@Module
public class OneModule {
    public class One {

    }

    @Provides
    @Singleton
    One provideOne() {
        return new One();
    }
}

@Module
public class TwoModule {

    public class Two {

    }

    @Provides
    @Singleton
    Two provideTwo() {
        return new Two();
    }
}

@Singleton
@Component(modules = OneModule.class)
public interface OneComponent {
    void inject(MoreActivity activity);
}

@Singleton
@Component(modules = TwoModule.class)
public interface TwoComponent {
    void inject(MoreActivity activity);
}

1 个答案:

答案 0 :(得分:1)

不,要使用字段注入,您的组件需要能够提供标有@Inject的所有依赖项。

如果要为每个类使用多个组件,可以使用提供方法手动设置字段。

@Module
public class OneModule {
    public class One {

    }

    @Provides
    @Singleton
    One provideOne() {
        return new One();
    }
}

@Module
public class TwoModule {

    public class Two {

    }

    @Provides
    @Singleton
    Two provideTwo() {
        return new Two();
    }
}

@Singleton
@Component(modules = OneModule.class)
public interface OneComponent {
    OneModule.One one();
}

@Singleton
@Component(modules = TwoModule.class)
public interface TwoComponent {
    TwoModule.Two two();
}

public class MoreActivity extends SingleFragmentActivity {

    OneModule.One one;
    TwoModule.Two two;

    @Override
    protected Fragment createFragment() {

        one = ((App)getApplication()).getOneComponent().one();
        two = ((App)getApplication()).getTwoComponent().two();

        return SimpleFragment.newInstance(MoreActivity.class.getSimpleName());
    }
}