У меня есть проект Android с Dagger2 v2.25.4 и Kotlin v1.3.61.
AppComponent. java
@Singleton
@Component(modules = {
AppModule.class,
BeansModule.class,
DaoModule.class
})
public interface AppComponent extends AutoGenComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder context(Context applicationContext);
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(MainApp app);
Context provideContext();
}
MainApp.kt
class MainApp : Application() {
@Inject lateinit var countManager: DataCountManager
@Inject lateinit var jobDispatcher: dagger.Lazy<JobDispatcher>
private var component: AppComponent? = null
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
instance = this
}
override fun onCreate() {
super.onCreate()
//Method ordering is matters here. Call initRealm before initDi
initRealm()
initDi()
initRx()
...
}
private fun initRx() {
//https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
//I don't want to crash the app every time i've got an exception
RxJavaPlugins.setErrorHandler { it.pst() }
//https://medium.com/@sweers/rxandroids-new-async-api-4ab5b3ad3e93
RxAndroidPlugins.setInitMainThreadSchedulerHandler {
AndroidSchedulers.from(Looper.getMainLooper(), true)
}
}
private fun initDi() {
component = DaggerAppComponent
.builder()
.context(this)
.application(this)
.build()
component!!.inject(this)
}
// override fun activityInjector(): DispatchingAndroidInjector<Activity> =
// activityDispatchingAndroidInjector
companion object {
var instance: MainApp? = null
fun getComponent() = instance!!.component
}
}
Gradle
classpath 'com.gradle:build-scan-plugin:1.16'
classpath 'com.android.tools.build:gradle:3.3.2'
AutoGenComponent поставляется из AnnotatedGroup. java
public class AnnotatedGroup {
private static final String CLASS_NAME = "AutoGenComponent";
private final List<AnnotatedData> data;
public AnnotatedGroup() {
data = new ArrayList<>();
}
public void add(AnnotatedData item) {
data.add(item);
}
public void generateCode(AvailableLanguage requiredLanguage,
ProcessingEnvironment env, Filer filer) throws IOException {
switch (requiredLanguage) {
case JAVA:
new JavaFileGenerator(CLASS_NAME, data).generate(filer);
break;
case KOTLIN:
String outputPath = env.getOptions().get("kapt.kotlin.generated").replace("kaptKotlin", "kapt");
new KotlinFileGenerator(outputPath, CLASS_NAME, data).generate(filer);
break;
}
}
public void clear() {
data.clear();
}
}
Но когда я обновляю его так:
classpath 'com.gradle:build-scan-plugin:2.4.2'
classpath 'com.android.tools.build:gradle:3.6.1'
сборка завершается неудачно из-за:
e: /.../dagger/component/AppComponent.java: error: cannot find symbol
public interface AppComponent extends AutoGenComponent {
^
symbol: class AutoGenComponent
и
e: /.../dagger/component/AppComponent.java: error: [ComponentProcessor:MiscError] dagger.internal.codegen.ComponentProcessor was unable to process this interface because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
public interface AppComponent extends AutoGenComponent {
^
Я пытался Очистить / Перестроить проект и / или Отменить кеширование / Перезапустить ... , но они функционируют, только если я верну Gradle. Я не знаю, требуется ли переход на AndroidX, но я делал это дважды, без каких-либо ожидаемых результатов.
Я обновлю вопрос, добавив build.gradle, если потребуется.