2016-02-12 4 views
0

Я столкнулся с очень странным поведением кинжала 2. Возможно, я просто не понимаю.Не может быть предоставлен без @ Provides- или @ Produces-аннотированного метода

Поэтому у меня есть 2 компонента:

AppComponent:

@Singleton 
@Component(modules = {/*my modules*/}) 
public interface AppComponent extends AppGraph { 

    @ForApplication Context getContext(); 

} 

ActivityComponent:

@ForActivity 
@Component(dependencies = AppComponent.class, modules = {ActivityModule.class}) 
public interface ActivityComponent extends AppComponent { 
    void inject(BaseActivity activity); 

    @ForActivity 
    BaseActivity getActivity(); 

} 

ForApplication:

@Qualifier 
@Retention(RUNTIME) 
public @interface ForApplication { 
} 

ForActivity:

@Scope 
@Retention(RUNTIME) 
public @interface ForActivity { 
} 

А также, у меня есть ActivityModule, который имеет provides методы:

@Module 
public class ActivityModule { 

    private final BaseActivity activity; 

    public ActivityModule(BaseActivity activity) { 
     this.activity = activity; 
    } 

    @ForActivity 
    @Provides 
    public BaseActivity provideActivityContext(){ 
     return activity; 
    } 

    @Provides 
    public ContextWrapper provideContextWrapper(){ 
     return new ContextWrapperImpl(activity); 
    } 

    @Provides 
    public CustomNavigator provideMakeDepositNavigator(){ 
     return new CustomNavigatorImpl(activity); 
    } 
} 

Так что, когда я впрыснуть ContextWrapper в моей деятельности, я не получайте ошибок.

Но когда я впрыснуть CustomNavigatorImpl, я получаю ошибку:

CustomNavigator cannot be provided without an @Provides- or @Produces-annotated method. Dagger 2

Эти 2 интерфейсов одинаковы.Но ContextWrapper впрыскивается и CustomNavigator не

ContextWrapper:

public interface ContextWrapper { 

    String getString(int resId); 

    Context getContext(); 
} 

MakeDepositNavigator:

public interface MakeDepositNavigator { 

    void showSomething1(); 

    void showSomething2(); 

    void showSomething3(); 

    /*...*/ 
} 

В классе приложения я создаю DaggerAppComponent:

DaggerSdkAppComponent.builder() 
       .applicationModule(new ApplicationModule(c)) 
       .build(); 

В BaseActivity я создаю ActivityComponent:

AppComponent component = ((HasComponent<AppComponent>) 
getApplicationContext()) 
        .getComponent(); 
      mComponent = DaggerActivityComponent.builder() 
        .activityModule(new ActivityModule(this)) 
        .appComponent(component) 
        .build(); 

Также BaseActivity имеет метод:

@Override 
public ActivityComponent getComponent() { 
    return mComponent; 
} 

И в CustomActivity, который простирается от BaseActivity я:

getComponent().inject(this); 

ОБНОВЛЕНО

Activity:

public class MakeDepositActivity extends BaseActivity{ 

/* some code */ 

    @Inject 
    public MakeDepositNavigator makeDepositNavigator; 

    @Inject 
    public ContextWrapper cw; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_make_deposit); 
     getComponent().inject(this); 

     /* some code */ 
    } 


    /* some code */ 

} 
+0

Не могли бы вы также добавить код своей деятельности с полями, которые вы пытаетесь ввести? –

+0

@DavidMedenjak, я обновил вопрос, добавил активность с поданной до нижней – Alexander

+0

'MakeDepositNavigator' - это интерфейс, который вы предоставляете в своем модуле? (Вы перепутали некоторые переименования.) Это выглядит хорошо ... Я бы проверял, если вы просто используете интерфейс –

ответ

1

У меня был подобный вопрос с тестированием.

@ForApplication Context getContext(); 

в AppComponent не может быть доступен для суб-класса ActivityComponent из-за пакета доступности (по умолчанию доступность).

Я думаю, что добавление public в качестве модификатора доступа решит вашу проблему.

Смежные вопросы

 Смежные вопросы