我有这个模块:
@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的新手,所以任何建议都会受到赞赏。
答案 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
,而不是类。而注入方法需要具体的类。