我是Dagger 2的新手,我正在寻找一种方法来获得“可配置组件”。匕首2模块“接口”?
本质上讲,这是我想达到什么:以上
public interface ErrorReporter{
...
}
public class ConsoleErrorReporter implements ErrorReporter{
... // Print to System.err
}
public class DialogErrorReporter implements ErrorReporter{
... // Show modal dialog to user
}
@Module
public interface UIModule{
@Provides
ErrorReporter provideErrorReporter();
}
@Module
public class ConsoleUIModule{
@Override
@Provides
ErrorReporter provideErrorReporter(ConsoleErrorReporter cer){
return cer;
}
}
@Module
public class GraphicalUIModule{
@Override
@Provides
ErrorReporter provideErrorReporter(DialogErrorReporter der){
return der;
}
}
@Component(modules = {UIModule.class, OtherUniversalModule.class})
public interface ApplicationComponent{
ErrorReporter errorReporter();
}
void main(String[] args){
final UIModule uiModule;
if(args.length == 1 && args[0].equals("gui")){
uiModule = new GraphicalUIModule();
}else{
uiModule = new ConsoleUIModule();
}
DaggerApplicationComponentdac = DaggerApplicationComponent.builder()
.uiModule(uiModule).build();
dac.errorReporter().showError("Hello world!");
}
失败@Provides methods cannot be abstract
遗憾的是无论是接口和抽象类。我也尝试过使用具体实现的非抽象基类,该实现返回null,然后在子类中重写这些类。但是这也会因@Provides methods may not override another method
而失败。
总之我想定义一个模块的合约,并在运行期间选择不同的模块。我知道Dagger 2的编译时间验证了对象图,但是如果我有一个明确定义的合同,它仍然可能是正确的?还是我不得不为两个用户界面创建两个不同的组件,其代码重复?我还有其他解决方案吗?
我种了它的工作,当我用''通过编译javac'它gradle'编译......但当我用'm2apt'在eclipse中编译时出现错误(或者称为w/e),因为它不会为继承“接口组件”的组件之一生成Dagger组件...您是否遇到过这个问题? –
@EmilyL。我从来没有在注释处理器上使用eclipse,所以我实在不知道。也许你在用eclipse使用不同的匕首版本?我使用了'2.10'。 –
我在gradle中使用'apt'插件来生成eclipse文件。我证实这是同一把匕首'2.10'。我将不得不深入挖掘:/ –