【发布时间】:2018-03-15 04:17:52
【问题描述】:
我正在尝试使用 dagger2 并希望将演示者注入活动,我在互联网上搜索了为什么演示者为空,但随后我得到了使用多个模块注入活动的不同实现。有人可以帮助我了解在尝试创建匕首依赖项时我哪里出错了吗?
我定义了以下类:
ActivityComponent.class
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
ActivityModule.class
@Module
public class ActivityModule {
private AppCompatActivity activity;
public ActivityModule(AppCompatActivity activity) {
this.activity = activity;
}
@Provides
AppCompatActivity provideActivity() {
return activity;
}
@Provides
@PerActivity public MainView provideMainView() {
return new MainViewImpl(activity);
}
@Provides
@ActivityScope
Context providesContext() {
return activity;
}
}
AppModule.class
@Singleton
@Module
public class AppModule {
private final GitHubApp application;
public AppModule(final GitHubApp application) {
this.application = application;
}
@Provides
Application provideApplication() {
return application;
}
@Provides
public GitHubLog provideGithubLog() {
return new GitHubLog();
}
}
GitHubModule.class
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
AppComponent.class
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
GithubComponent.class
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
在应用程序类中,我创建了一个appcomponent 实例和githubcomponent 实例,我在BaseActivity 中使用它来创建activitycomponent。
我在MainAcitivity that extends BaseActivity 中注入了演示者,然后我得到一个空指针异常,说演示者为空。
我的实现不正确吗?我可能会错过什么?
编辑: GithubApp.class
public class GitHubApp extends Application {
public static GitHubApp INSTANCE;
private AppComponent appComponent;
private GitHubComponent gitHubComponent;
@Override
public void onCreate() {
super.onCreate();
INSTANCE = this;
getAppComponent().inject(this);
}
public AppComponent getAppComponent() {
if (appComponent == null) {
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.gitHubModule(new GitHubModule())
.build();
}
return appComponent;
}
public GitHubComponent getGitHubComponent() {
if (gitHubComponent == null) {
gitHubComponent = DaggerGitHubComponent.builder()
.gitHubModule(new GitHubModule())
.build();
}
return gitHubComponent;
}
}
我如何将演示者注入活动如下: BaseActivity.class 有一个返回活动组件的方法
return DaggerActivityComponent.builder()
.appComponent(((GitHubApp)getApplication()).getAppComponent())
.gitHubComponent(((GitHubApp)getApplication()).getGitHubComponent())
.activityModule(new ActivityModule(this))
.build();
在 MainActivity.class 我这样使用它:
在调用super.onCreate() 之前,调用getActivityComponent().inject(this);
@注入 MainPresenter mainPresenter 是变量声明
EDIT2:
Chisko 和 Muhammad Babar 建议的更改协同工作,因为还需要将inject(AppCompatActivity activity) 更改为inject(MainActivity activity)
【问题讨论】:
-
发布你的 GitHubApp 课程
-
您的
ActivityComponent还应该为演示者定义一个方法。类似MainPresenter presenter(); -
组件应该以抽象的方式反映模块所做的事情。我知道,听起来多余。
-
在您的
ActivityComponent中将void inject(AppCompatActivity activity);替换为void inject(MainActivity activity)并告诉我它是否有效。 -
@MuhammadBabar,有了您建议的更改,以及下面的代码,它现在可以工作了.. 非常感谢.. 我如何在您和 chisko 之间分享积分?
标签: android dagger-2 android-mvp