2016-02-12 70 views
0

我面臨着匕首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

這兩個接口是相同的。但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作爲訪問修飾符將解決您的問題。