我是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'。我將不得不深入挖掘:/ –