[英]Dagger 2 error injecting dependencies in android
我正在使用Dagger 2学习DI,但是我在依赖注入方面遇到了一些问题,因为我正在为此应用程序使用MVP,所以我将所有类打包了。
我正在尝试向演示者注入依赖关系,但出现此错误“如果没有@Provides注释的方法就无法提供。”,我检查了我的代码,并检查了一些示例,并假设我注入这种依赖关系,我已经尝试了不同的方式,但无法解决此错误,也不知道如何解决。
只有我想打开第二个从演示者SplashActivity调用的活动,但是要通过DI注入。
摇篮图书馆
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();
}
}
BaseActivity.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();
}
这里似乎唯一的问题是SplashPresenterImpl
类的构造函数中的splashView
参数。 当dagger创建SplashPresenterImpl
对象时,它会尝试查找返回SplashView
的@Provides
方法。 基本上,它试图在依赖关系图中找到SplashView
,并且由于不存在使用@Provides
注释的方法来返回此对象,因此会出现此错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.