#android #dagger-2 #dagger
#Android #dagger-2 #dagger
Вопрос:
Я использую Dagger 2 в Android Studio, но при попытке создать компонент с помощью DaggerMyComponent.builder().MyModule (new MyModule()).build(), я всегда вижу слово «builder()» красным цветом и надпись «не удается разрешить построитель символов».
Я должен сказать, что я много раз очищал и создавал проект, даже комментируя экземпляр компонента и удаляя его после перестройки. Я должен также сказать, что я могу проверить DaggerMyComponent.class и, кажется, все в порядке, на самом деле, я могу импортировать этот класс без проблем.
Пример опубликован на GitHub по этой ссылке:
https://github.com/alessandroargentieri/LetsDagger2Together
У меня есть два класса: BClass и AClass, которые зависят от первого. У меня есть ABModule.class который является заводским методом и ABComponent, который является интерфейсом компонента. DaggerABComponent создается в WholeApplication.class что расширяет возможности приложения.
package mawashi.alex.letsdagger2together.Application;
import android.app.Application;
import mawashi.alex.letsdagger2together.DaggerClasses.ABComponent;
import mawashi.alex.letsdagger2together.DaggerClasses.ABModule;
import mawashi.alex.letsdagger2together.DaggerClasses.DaggerABComponent;
public class WholeApplication extends Application {
static ABComponent component;
@Override
public void onCreate() {
super.onCreate();
//here is where builder() is not recognized
component = new DaggerABComponent.builder().aBModule(new ABModule()).build();
}
public static ABComponent getComponent(){
return component;
}
}
Модуль:
package mawashi.alex.letsdagger2together.DaggerClasses;
import dagger.Module;
import dagger.Provides;
import mawashi.alex.letsdagger2together.Model.AClass;
import mawashi.alex.letsdagger2together.Model.BClass;
@Module
public class ABModule {
@Provides
public BClass provideBClass(){
return new BClass("xxx");
}
@Provides
public AClass provideAClass(BClass bClass){
return new AClass(bClass);
}
}
Компонент:
package mawashi.alex.letsdagger2together.DaggerClasses;
import dagger.Component;
import mawashi.alex.letsdagger2together.MainActivity;
@Component (modules = {ABModule.class})
public interface ABComponent {
public void inject(MainActivity mainActivity);
}
Классы, которые должны быть введены:
package mawashi.alex.letsdagger2together.Model;
public class BClass {
private String xfactor;
public BClass(String xfactor){
this.xfactor = xfactor;
}
public String getXfactor(){
return xfactor;
}
}
package mawashi.alex.letsdagger2together.Model;
public class AClass {
private BClass b;
public AClass(BClass b){
this.b = b;
}
public String getYfactor(){
return "Y-" b.getXfactor() "-Y";
}
}
Место, куда вводить AClass и BClass:
package mawashi.alex.letsdagger2together;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import javax.inject.Inject;
import mawashi.alex.letsdagger2together.Application.WholeApplication;
import mawashi.alex.letsdagger2together.DaggerClasses.ABModule;
import mawashi.alex.letsdagger2together.DaggerClasses.DaggerABComponent;
import mawashi.alex.letsdagger2together.Model.AClass;
public class MainActivity extends AppCompatActivity {
@Inject AClass a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WholeApplication.getComponent().inject(this);
Toast.makeText(this, a.getYfactor(),Toast.LENGTH_LONG).show();
}
}
Если кто-нибудь знает, в чем я ошибаюсь, это было бы очень приятно для меня. Спасибо всем.
Комментарии:
1. пожалуйста, поделитесь своим кодом, чтобы увидеть, чего не хватает..
2. посмотрите на ссылку на GitHub, написанную выше… особенно классы ABModule, ABComponent, WholeApplication… Спасибо!!
Ответ №1:
О, я понял это.
Вы добавили эту строку:
component = new DaggerABComponent.builder().aBModule(new ABModule()).build();
И это должна быть эта строка:
component = DaggerABComponent.builder().aBModule(new ABModule()).build();
Так что просто удалите new
, и тогда это сработает.
Комментарии:
1. Отлично! Спасибо за ваше распоряжение!
Ответ №2:
Все поля с аннотацией @Inject должны быть общедоступными: @Inject public AClass a;
в вашей активности
Комментарии:
1. Я опубликовал различные классы. Как вы можете видеть, я использовал все правильные аннотации, и я проверил это DaggerABComponent.class был создан
2. Я изменил ответ
3. Достаточно защищенного пакета.