Android Dagger 2 не может разрешить построитель символов ()

#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. Достаточно защищенного пакета.