Я изучаю DI с Dagger 2, но у меня есть некоторые проблемы с внедрением зависимостей, я использую MVP для этого приложения, поэтому я разделил по пакетам все мои классы.
Я пытаюсь внедритьзависимость от моего докладчика, но я получаю эту ошибку "не может быть предоставлено без аннотированного @ Provides метода.", я проверил свой код и проверил несколько примеров, и я предполагаю, что я внедряю эту зависимость, я 'Я пытался по-разному, и я не могу исправить эту ошибку, и я не знаю, как ее исправить.
Только я хочу открыть второе действие, вызывающее из SplashActivity докладчик, но внедряющее это через DI.
Библиотека в Gradle
implementation 'com.google.dagger:dagger:2.17'
annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
MovieApplication.java
public class MovieApplication extends Application {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
setupGraph();
}
private void setupGraph() {
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
}
public static MovieApplication get(Context context){
return (MovieApplication) context.getApplicationContext();
}
public AppComponent getAppComponent() {
return appComponent;
}
}
AppComponent.java
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
@ApplicationContext
Context context();
}
AppModule.java
@Module
public class AppModule {
private MovieApplication mMovieApplication;
public AppModule(MovieApplication movieApplication) {
this.mMovieApplication = movieApplication;
}
@Provides
@ApplicationContext
Context provideContext(){
return mMovieApplication;
}
@Provides
Application provideApplication(){
return mMovieApplication;
}
}
MovieComponent.java
@MovieScreenScope
@Component(dependencies = AppComponent.class, modules = MovieModule.class)
public interface MovieComponent {
void inject(SplashActivity splashActivity);
}
MovieModule.java
@Module
public class MovieModule {
private Activity mActivity;
public MovieModule(Activity activity) {
this.mActivity = activity;
}
@Provides
@ActivityContext
Context provideContext(){
return mActivity;
}
@Provides
Activity provideActivity(){
return mActivity;
}
@Provides
@MovieScreenScope
SplashPresenter<SplashView> provideSplashPresenter(SplashPresenterImpl<SplashView> presenter){
return presenter;
}
}
SplashActivity.java
public class SplashActivity extends BaseActivity implements SplashView {
@Inject
SplashPresenter<SplashView> presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getMovieComponent().inject(this);
presenter.openLoginActivity();
}
@Override
public void openLoginActivity() {
startActivity(new Intent(SplashActivity.this, LoginActivity.class));
finish();
}
@Override
public void openHomeActivity() {
startActivity(new Intent(SplashActivity.this, ContainerActivity.class));
finish();
}
}
BaseActtivity.java
public class BaseActivity extends AppCompatActivity {
private MovieComponent movieComponent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupGraph();
}
private void setupGraph() {
movieComponent = DaggerMovieComponent.builder()
.movieModule(new MovieModule(this))
.appComponent(MovieApplication.get(this).getAppComponent())
.build();
}
public MovieComponent getMovieComponent() {
return movieComponent;
}
}
SplashView.java
public interface SplashView {
void openLoginActivity();
void openHomeActivity();
}
SplashPresenter.java
public class SplashPresenterImpl<V extends SplashView> implements SplashPresenter<V> {
private SplashView splashView;
@Inject
public SplashPresenterImpl(V splashView) {
this.splashView = splashView;
}
@Override
public void openLoginActivity() {
splashView.openLoginActivity();
}
@Override
public void openMainActivity() {
}
@Override
public void verifyInternetConection() {
}
@Override
public void getMoviesData() {
}
}
SplashPresenter.java
@MovieScreenScope
public interface SplashPresenter <V extends SplashView> {
void openLoginActivity();
void openMainActivity();
void verifyInternetConection();
void getMoviesData();
}