Ошибка Dagger 2 при введении зависимостей в Android - PullRequest
0 голосов
/ 25 августа 2018

Я изучаю 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();
}

1 Ответ

0 голосов
/ 26 августа 2018

Единственная проблема здесь, кажется, с параметром splashView в конструкторе класса SplashPresenterImpl. Когда кинжал создает объект SplashPresenterImpl, он пытается найти метод @Provides, который возвращает SplashView. По сути, он пытается найти SplashView в графе зависимостей, и поскольку не существует метода, помеченного @Provides, который возвращает этот объект, он выдает эту ошибку.

...