我一直在测试 Dagger 2,一切都正常,直到我做了一些重构。现在 gradle 正在抛出一个IllegalArgumentException
,而且我无法弄清楚我所做的更改现在导致了错误。我没有对 gradle 文件进行任何更改,这似乎是堆栈跟踪的主要内容:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':mobile:compileDebugJavaWithJavac'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
...
Caused by: java.lang.IllegalArgumentException
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:108)
at dagger.internal.codegen.writer.ClassName.peerNamed(ClassName.java:130)
at dagger.internal.codegen.SourceFiles.membersInjectorNameForMembersInjectionBinding(SourceFiles.java:266)
at dagger.internal.codegen.InjectBindingRegistry.registerBinding(InjectBindingRegistry.java:194)
at dagger.internal.codegen.InjectBindingRegistry.registerBinding(InjectBindingRegistry.java:171)
at dagger.internal.codegen.InjectProcessingStep.process(InjectProcessingStep.java:129)
at dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:228)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
... 89 more
Dagger 也不会生成任何文件,以前是这样。我一直在尝试一切我能找到的方法来解决这个问题,主要涉及修复 gradle 文件或清除构建文件夹,但到目前为止没有任何效果。
快速更新(因为我注意到一些赞成票);我从来没有发现我做错了什么,我最终恢复到旧版本。恢复后,我再次进行了重构,效果很好。当我最初重构代码时,我一定做了一些不同的事情,但我不知道它是什么。
如果有人知道可能导致此问题的原因,我相信它会帮助其他已经或将来遇到此问题的人。
我在将 Firebase 引入项目时遇到了这个问题。这是第一个添加到项目中的后台服务,因此我决定对一个不执行任何操作的服务进行一些调查。
这构建了:
public class HopefullyBuildsService extends IntentService {
public HopefullyBuildsService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
}
}
..............
@ApplicationScoped
@Component(modules = {ApplicationModule.class, RestModule.class})
public interface ApplicationComponent {
...
void inject(HopefullyBuildsService service);
...
}
但这导致构建失败:
public class HopefullyBuildsService extends FirebaseMessagingService {
}
..............
@ApplicationScoped
@Component(modules = {ApplicationModule.class, RestModule.class})
public interface ApplicationComponent {
...
void inject(HopefullyBuildsService service);
...
}
无论出于何种原因,尝试直接注入 Firebase 派生服务都会导致构建按照您所描述的方式失败。然而,间接注入另一个类,然后在服务内以老式方式实例化它,可以让它再次构建。
public class FirebaseDaggerInjectHelper {
@Inject
PersistManager persistManager;
@Inject
RestClient restClient;
@Inject
OtherClasses stuffEtc;
public FirebaseDaggerInjectHelper(MyApplication application){
application.getApplicationComponent().inject(this);
}
//getters and setters n stuff
}
........
@ApplicationScoped
@Component(modules = {ApplicationModule.class, RestModule.class})
public interface ApplicationComponent {
...
void inject(FirebaseDaggerInjectHelper helper);
...
}
........
public class HopefullyBuildsService extends FirebaseMessagingService {
private FirebaseDaggerInjectHelper injectHelper;
@Override
public void onCreate() {
super.onCreate();
injectHelper = new FirebaseDaggerInjectHelper((MyApplication) getApplicationContext());
}
然后它构建得很好。不可否认,拥有这个中间人类很烦人,并且 firebase 派生服务必须以间接方式与注入的组件进行交互。但我不清楚为什么我不能注入 Firebase 派生服务,或者 Firebase 有什么特别之处让 Dagger2 不高兴。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)