我是一位新手,对Dagger 2不太熟悉,现在我正在寻找一种实现“可配置组件”的方法。
基本上,我想要实现以下内容:
以上代码无论是针对接口还是抽象类都会出现@Provides方法不能为抽象的问题。我已经试过在非抽象基类中实现返回null的具体实现,然后在子类中重写这些实现,但是这也会出现@Provides方法不能覆盖其他方法的问题。
简而言之,我想要为一个模块定义一个契约,并在运行时选择不同的模块。我知道Dagger 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方法不能为抽象的问题。我已经试过在非抽象基类中实现返回null的具体实现,然后在子类中重写这些实现,但是这也会出现@Provides方法不能覆盖其他方法的问题。
简而言之,我想要为一个模块定义一个契约,并在运行时选择不同的模块。我知道Dagger 2在编译时验证对象图,但如果我有一个定义良好的合约,那么这应该仍然是可能的,对吗?或者我是否被迫为两个用户界面创建具有重复代码的两个不同组件?我是否遗漏了其他解决方案?
gradle
用javac
编译时,它可以编译...但是当我使用m2apt
在eclipse中编译时,我会遇到错误(或者叫其他名字)由于某种原因,它不会为继承“接口组件”的一个组件生成dagger组件...你遇到过这种情况吗? - Emily L.2.10
。 - David Medenjakapt
插件来生成eclipse文件。并且我已验证它与Dagger2.10
相同。我将不得不深入挖掘 :/ - Emily L.