2016-12-19 15 views
0

Я пытаюсь создать проект с кинжалом. Сейчас, когда я строю, ни один из Кинжал * классы создаются для компонентов, и я получаю следующие ошибки:Кинжал не будет создавать классы кинжалов для Android

Error:(10, 8) error: [com.redditapp.dagger.RedditAppGraph.inject(com.redditapp.RedditApplication)] 
com.redditapp.ui.ActivityHierarchyServer cannot be provided without an @Provides- or @Produces-annotated method. 
com.redditapp.ui.ActivityHierarchyServer is injected at 
com.redditapp.RedditApplication.activityHierarchyServer 
com.redditapp.RedditApplication is injected at 
com.redditapp.dagger.RedditAppGraph.inject(app) 

и

Error:(13, 10) error: com.redditapp.base.navigation.activity.ActivityScreenSwitcher cannot be provided without an @Inject constructor or from an @Provides-annotated method. 
com.redditapp.base.navigation.activity.ActivityScreenSwitcher is injected at 
com.redditapp.ui.screens.home.HomePresenter.<init>(screenSwitcher) 
com.redditapp.ui.screens.home.HomePresenter is injected at 
com.redditapp.ui.screens.home.HomeActivity.presenter 
com.redditapp.ui.screens.home.HomeActivity is injected at 
com.redditapp.ui.screens.home.HomeComponent.inject(activity) 

Вот моя текущая настройка.

класс на уровне приложений использует:

public void buildComponentAndInject() { 
     component = RedditAppComponent.Initializer.init(this); 
     component.inject(this); 
    } 

RedditAppComponent выглядит так и DaggerRedditAppComponent не генерируется и поэтому красный цвет:

@ApplicationScope 
@Component(modules = { RedditAppModule.class, UiModule.class}) 
public interface RedditAppComponent extends RedditAppGraph { 
    /** 
    * An initializer that creates the graph from an application. 
    */ 
    final class Initializer { 
     public static RedditAppComponent init(RedditApplication app) { 
      return DaggerRedditAppComponent.builder() 
        .redditAppModule(new RedditAppModule(app)) 
        .uiModule(new UiModule()) 
        .build(); 
     } 
     private Initializer() {} // No instances. 
    } 
} 

С родительского класса RedditAppGraph:

public interface RedditAppGraph { 
    void inject(RedditApplication app); 
    ViewContainer viewContainer(); 
    ActivityHierarchyServer activityHierarchyServer(); 
} 

Модуль пользовательского интерфейса, содержащий методы провайдера, которые запускают g ошибки выглядят так:

@Module 
public class UiModule { 

    @Provides 
    @ApplicationScope 
    ActivityScreenSwitcher provideActivityScreenSwitcher() { 
     return new ActivityScreenSwitcher(); 
    } 

    @Provides 
    @ApplicationScope 
    @ActivityScreenSwitcherServer 
    ActivityHierarchyServer provideActivityHierarchyServer(final ActivityScreenSwitcher screenSwitcher) { 
     return new ActivityHierarchyServer.Empty() { 
      @Override 
      public void onActivityStarted(Activity activity) { 
       screenSwitcher.attach(activity); 
      } 

      @Override 
      public void onActivityStopped(Activity activity) { 
       screenSwitcher.detach(); 
      } 
     }; 
    } 
} 

Я попытался перестроить проект, чтобы узнать, сгенерирует ли он классы.

+0

Вы применяете компилятор? у вас есть что-то вроде градиента построения '' apt 'com.google.dagger: dagger-compiler: 2.8 "' '? – Fred

+0

Я делаю, но вместо apt я использую annotationProcessor. – AggieDev

ответ

2

Похоже, ActivityScreenSwitcherServer является квалификатором. Если это так, вы связываете свой ActivityHierarchyServer с квалификатором, но без него ActivityHierarchyServer на вашем компоненте (через RedditAppGraph). Удалите классификатор из вашего метода @Provides или добавьте его в интерфейс компонента.

+0

Удивительный, спасибо Грегори! Работал как шарм. – AggieDev

+2

FWIW, мы планируем предоставить вам «предлагаемые исправления», подобные этому в самом сообщении об ошибке, но мы еще не сделали этого. – gk5885