Dagger2不是注射场

时间:2016-07-06 14:22:25

标签: android dagger-2

我有这个模块:

@Module
public class MainModule {

    private Context context;

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

    @Provides
    @Singleton
    Dao providesDao() {
        return new Dao();
    }

    @Provides
    @Singleton
    FirstController providesFirstController(Dao dao) {
        return new FirstController(dao);
    }

    @Provides
    @Singleton
    SecondController providesSecondController(Dao dao) {
        return new SecondController(dao);
    }

}

和这个组件:

@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {

    void inject(FirstView view);

    void inject(SecondView view);

}

,最后,注入器类,在App.onCreate()方法中初始化:

public enum Injector {

    INSTANCE;

    MainComponent mainComponent;

    public void initialize(App app) {
        mainComponent = DaggerMainComponent.builder()
                .mainModule(new MainModule(app))
                .build();
    }

    public MainComponent getMainComponent() {
        return mainComponent;
    }
}

在我的FirstView和SecondView(Fragment s)中,我有这个:

    @Inject
    FirstController controller; //and SecondController for the second view

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Injector.INSTANCE.getMainComponent().inject(this);
    }

在第一个片段中,一切正常,控制器被注入。但在第二种观点中,它不是:只返回null

我在“提供”模块的方法中添加了断点,providesFirstController已执行,但未执行providesSecondController

我做错了什么?我是Dagger2的新手,所以任何建议都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

如果这些是Fragments,请尝试移动与注入相关的代码:

Injector.INSTANCE.getMainComponent().inject(this);

Fragment的{​​{1}}方法。 如果视图在屏幕上同时显示(由public void onCreate(Bundle savedInstanceState)添加),则可能无法调用FragmentManager SecondView方法。

答案 1 :(得分:0)

解决!我已将inject方法的签名更改为:

@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {

    void inject(FirstFragment view);

    void inject(SecondFragment view);

}

我忘了说FirstView和SecondView是interface,而不是类。而注入方法需要具体的类。