Ответ 1
Пожалуйста, добавьте
apt 'com.google.dagger:dagger-compiler:2.x'
в файл build.gradle приложения
Я пытаюсь использовать Кинжал 2 на Android. Раньше я работал, и у меня были приложения appModule для инъекций в определенные классы в приложении. Моя проблема в том, что iam получает ошибку
Error:(14, 55) error: cannot find symbol class DaggerAppComponent
который пытается импортировать. это автогенерированный класс
ниже указаны мои зависимые зависимости Dagger в файле build.gradle
compile 'com.google.dagger:dagger-compiler:2.0.2'
compile 'com.google.dagger:dagger:2.0.2'
provided 'javax.annotation:jsr250-api:1.0'
Ive попытался очистить и восстановить приложение несколько раз, но класс не будет генерировать. Ive также попытался использовать
compile 'org.glassfish:javax.annotation:10.0-b28'
для моих аннотаций, но мне не повезло? Если кто-то может мне помочь, признайте его. Его трудно понять, что сейчас происходит для меня? Благодаря
EDIT: код компонента это работало раньше, и я просто добавил 1 дополнительный класс для ввода в?
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(RegHelper reghelper);
void inject(headerFooterRecViewAdapter headadapter);
void inject(SectionListExampleActivity seclistactivity);
}
Пожалуйста, добавьте
apt 'com.google.dagger:dagger-compiler:2.x'
в файл build.gradle приложения
Настройка автономного проекта в Android Studio 2.3, я обновил файлы по умолчанию gradle следующим образом, чтобы получить сгенерированный компонентный файл. Добавленные строки имеют комментарий // dagger2 addition
PROJECT build.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
// dagger2 addition
classpath 'com.android.tools.build:gradle:1.0.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.+'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
// dagger2 addition
mavenCentral()
maven{
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
APP MODULE build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt' // dagger2 addition
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.demo.dagger2demo"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
// dagger2 addition
compile 'com.google.dagger:dagger:2.+'
apt "com.google.dagger:dagger-compiler:2.+"
}
Это сделало трюк для меня с (текущими) последними качествами кинжала.
`dependencies{
...
compile 'com.google.dagger:dagger:2.11'
compile 'com.google.dagger:dagger-android-support:2.11'
annotationProcessor "com.google.dagger:dagger-compiler:2.11"
}`
Вам нужно установить этот плагин https://bitbucket.org/hvisser/android-apt, чтобы Android Studio увидела компоненты Dagger.
У меня была аналогичная проблема с Dagger 2. У меня был AppComponent и ActivityComponent (являющийся подкомпонентом). И как только я добавлю новую функцию inject() в AppComponent, я получу вышеуказанные ошибки.
Было больше ошибок, кроме ошибки "не найти символ", но они были очень расплывчатыми, и я не мог отлаживать свои проблемы. После копания и исследования stackoverflow и различных учебников я понял, что неправильно использовал кинжал. В частности, был настроен мой AppComponent и ActivityComponent.
Я был в предположении, что я мог бы вводить свою "активность" или "фрагмент" как с моим AppComponent, так и с ActivityComponent. Это оказалось неправильным, по крайней мере, я узнал, что это не правильный способ использования кинжала.
Мое решение:
AppComponent
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MyApp application);
void inject(ContextHelper contextHelper);
// for exports
MyApp application();
PrefsHelper prefsHelper();
}
Модуль приложения
@Module
public class AppModule {
private final MyApp application;
public AppModule(MyApp application) {
this.application = application;
}
@Provides @Singleton
public MyApp application() {
return this.application;
}
@Provides @Singleton
public PrefsHelper providePrefsHelper() {
PrefsHelper prefsHelper = new PrefsHelper(application);
return prefsHelper;
}
}
ActivityComponent
@ActivityScope
@Component (dependencies = {AppComponent.class}, modules = {ActivityModule.class})
public interface ActivityComponent {
void inject(MainActivity activity);
void inject(OtherActivity activity);
void inject(SomeFragment fragment);
}
ActivityModule
@Module
public class ActivityModule {
private final MyActivity activity;
public ActivityModule(MyActivity activity) {
this.activity = activity;
}
@Provides @ActivityScope
public ContextHelper provideContextHelper(MyApp application) {
// My ContextHelper depends on certain things from AppModule
// So I call appComponent.inject(contextHelper)
AppComponent appComponent = application.getAppComponent();
ContextHelper contextHelper = new ContextHelper(activity);
appComponent.inject(contextHelper);
return contextHelper;
}
}
Приложение
public class MyApp extends Application {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
initializeDepInj();
}
private void initializeDepInj() {
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
appComponent.inject(this);
}
public LockAppComponent getAppComponent() {
return appComponent;
}
}
Деятельность
public class MainActivity extends AppCompatActivity {
// I get it from ActivityModule
@Inject
ContextHelper contextHelper;
// I get it from AppModule
@Inject
PrefsHelper prefsHelper;
ActivityComponent component;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupInjection();
}
protected void setupInjection() {
MyApp application = (MyApp) getApplication();
component = DaggerActivityComponent.builder()
.appComponent(application.getAppComponent())
.activityModule(new ActivityModule(this))
.build();
component.inject(this);
// I was also doing the following snippet
// but it not the correct way since the ActivityComponent depends
// on AppComponent and therefore ActivityComponent is the only
// component that I should inject() with and I'll still get classes
// that are provided by the AppComponent/AppModule
// application.getAppComponent().inject(this); // this is unneccessary
}
public ContextHelper getContextHelper() {
return contextHelper;
}
}
Я не знаю, разрешает ли он вашу проблему, но она должна хотя бы пролить свет на то, как правильно использовать кинжал.
Надеюсь, что это поможет.
У меня была такая же проблема с моей установкой, Android Studio 2.2 в следующем классе приложения:
public class NetApp extends Application {
private NetComponent mNetComponent;
@Override
public void onCreate() {
super.onCreate();
// Dagger%COMPONENT_NAME%
mNetComponent = DaggerNetComponent.builder()
// list of modules that are part of this component need to be created here too
.appModule(new AppModule(this)) // This also corresponds to the name of your module: %component_name%Module
.netModule(new NetModule("https://api.github.com"))
.build();
// If a Dagger 2 component does not have any constructor arguments for any of its modules,
// then we can use .create() as a shortcut instead:
// mNetComponent = com.codepath.dagger.components.DaggerNetComponent.create();
}
public NetComponent getNetComponent() {
return mNetComponent;
}
}
Я использую следующее объявление gradle для кинжала 2:
//Dagger 2
// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.7'
compile 'com.google.dagger:dagger:2.7'
provided 'javax.annotation:jsr250-api:1.0'
Я мог бы решить проблему, восстановив полный проект (с ошибками), а затем добавив импорт ранее отсутствующего DaggerNetComponent.
Просто добавьте класс @Module в Api и перестройте проект.
Надеюсь, вы все хорошо себя чувствуете. Я столкнулся с той же проблемой и потратил много времени на переполнение стека. Наконец, я прохожу через this и могу найти решение. Вкратце, вы должны внести некоторые изменения в свой файл уровня Gradle на уровне модуля. Удалите
apply plugin: 'com.neenbedankt.android-apt'
в верхней части файла. И замените
apt 'com.google.dagger:dagger-compiler:2.11'
с
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
После этого перестройте свой проект, и вы сможете импортировать классы префикса Dagger. Hopw это поможет вам.