Android Кинжал 2: невозможно предоставить без аннотированного метода @ Provides - PullRequest
0 голосов
/ 23 апреля 2020

В моем проекте Android я использую Dagger 2. для управления внедрением зависимостей.

Вот что у меня есть в приложении (я упростил код, чтобы его было легче понять):

  • MainActivity:
public class MainActivity extends DaggerAppCompatActivity
{
    @Inject MainRepository mainRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) { ... }
}
  • MainRepository, который я добавляю в MainActivity:
public class MainRepository
{

    @Inject ItemsDAO itemsDAO;

    public MainRepository()
    {
        MyApplication.getAppComponent().inject(this);
    }
}
  • ItemsDAO, основа c Класс DAO, который я хочу добавить в MainRepository:
public class ItemsDAO
{
    ....
}
  • MyApplication:
public class MyApplication extends DaggerApplication
{
    private static MyApplication instance;
    private AppComponent appComponent;

    @Override
    public void onCreate()
    {
        super.onCreate();
        instance = this;
    }

    public static AppComponent getAppComponent()
    {
        return instance.appComponent;
    }

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector()
    {
        appComponent = DaggerAppComponent.builder().application(this).build();
        return appComponent;
    }
}

ОК, теперь вот Часть 2 кинжала:

  • Компонент приложения:
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class})
public interface AppComponent extends AndroidInjector<MyApplication>
{

    @Component.Builder
    interface Builder
    {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }

    void inject(MainRepository mainRepository);
}
  • Модуль приложения:
@Module
abstract class AppModule
{
    @ContributesAndroidInjector(modules = {MainModule.class})
    abstract MainActivity contributeMainActivity();

    @Provides
    static Context provideContext(Application application)
    {
        return application;
    }
}
  • MainModule:
@Module
abstract class MainModule
{
    @Provides
    static MainRepository provideMainRepository()
    {
        return new MainRepository();
    }

    @Provides
    static ItemsDAO provideItemsDAO(Context context)
    {
        return new ItemsDAO();
    }
}

Вот моя проблема: когда я помещаю метод provideItemsDAO() в AppModule, у меня не возникает ошибки компиляции, и она работает нормально. Но когда я вставил его в MainModule (как показано выше), я получил следующую ошибку:

com.testproject.dao.ItemsDAO cannot be provided without an @Provides-annotated method.

Почему я хочу это сделать, потому что я хочу (если я правильно понимаю Dagger 2) ItemsDAO быть созданным только один раз за весь жизненный цикл MainActivity. Конечно, в этом базовом c примере это будет так или иначе, но я хотел бы знать, как этого добиться, чтобы я мог управлять более сложным сенаром ios (например, используя один и тот же экземпляр для нескольких фрагментов, добавленных в MainActivity).

Так как я могу исправить эту ошибку? Что я пропустил?

Спасибо.

...