Android 在活动中注入时,演示者为空
我正在试用dagger2,想在活动中插入一个演示者,我在互联网上搜索了演示者为空的原因,但是我得到了不同的注入活动的实现,其中包含几个模块。有人能帮我理解我在尝试创建匕首依赖项时出错的地方吗 我定义了以下类: 活动组件类Android 在活动中注入时,演示者为空,android,dagger-2,android-mvp,Android,Dagger 2,Android Mvp,我正在试用dagger2,想在活动中插入一个演示者,我在互联网上搜索了演示者为空的原因,但是我得到了不同的注入活动的实现,其中包含几个模块。有人能帮我理解我在尝试创建匕首依赖项时出错的地方吗 我定义了以下类: 活动组件类 @PerActivity @Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class}) public interface Acti
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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;
}
}
活动模块类
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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;
}
}
AppModule.class
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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;
}
}
GitHubModule.class
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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;
}
}
AppComponent.class
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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;
}
}
GithubComponent.class
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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;
}
}
在application类中,我创建了一个appcomponent
实例和githubcomponent
实例,我在BaseActivity中使用它来创建activitycomponent
我将presenter插入扩展BaseActivity的MainActivity中,得到一个null指针异常,表示presenter为null
我的实现不正确吗?我会错过什么
编辑:
GithubApp.class
@PerActivity
@Component(modules = {ActivityModule.class}, dependencies = {AppComponent.class, GitHubComponent.class})
public interface ActivityComponent {
void inject(AppCompatActivity activity);
}
@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;
}
}
@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();
}
}
@Module
public class GitHubModule {
@Provides
public MainInteractor provideMainInteractor() {
return new MainInteractorImpl();
}
@Provides
@PerActivity
public MainPresenter provideMainPresenter(){
return new MainPresenterImpl();
}
}
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(GitHubApp gitHubApp);
void inject(GitHubLog gitHubLog);
Application application();
GitHubLog getGitHubLog();
}
@Component(modules = {GitHubModule.class, AppModule.class})
public interface GitHubComponent {
void inject(MainPresenterImpl presenter);
}
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活动)
更改为inject(MainActivity活动)
除了注释之外,我认为您还缺少其他设置:
GitHubApp.java
GitHubAppComponent component;
// call this inside onCreate()
private void setupComponent() {
component = DaggerGitHubAppComponent.builder()
.gitHubModule(new GitHubModule(this))
.build();
}
public GitHubAppComponent getComponent() {
return component;
}
abstract void setupComponent(GitHubAppComponent appComponent);
@Override
protected void onCreate(Bundle savedInstanceState) {
...
GitHubApp app = (GitHubApp) getApplication();
GutHubAppComponent component = app.getComponent();
setupComponent(component);
}
@Override
protected void setupComponent(GitHubAppComponent appComponent) {
ActivityComponent component = DaggerMainActivityComponent.builder()
.gitHubAppComponent(appComponent)
.activityModule(new ActivityModule(this))
.build()
component.inject(this);
}
以及活动组件,它需要在您创建的BaseActivity
上使用抽象方法:
BaseActivity.java
GitHubAppComponent component;
// call this inside onCreate()
private void setupComponent() {
component = DaggerGitHubAppComponent.builder()
.gitHubModule(new GitHubModule(this))
.build();
}
public GitHubAppComponent getComponent() {
return component;
}
abstract void setupComponent(GitHubAppComponent appComponent);
@Override
protected void onCreate(Bundle savedInstanceState) {
...
GitHubApp app = (GitHubApp) getApplication();
GutHubAppComponent component = app.getComponent();
setupComponent(component);
}
@Override
protected void setupComponent(GitHubAppComponent appComponent) {
ActivityComponent component = DaggerMainActivityComponent.builder()
.gitHubAppComponent(appComponent)
.activityModule(new ActivityModule(this))
.build()
component.inject(this);
}
然后,您的活动还应创建组件:
MainActivity.java
GitHubAppComponent component;
// call this inside onCreate()
private void setupComponent() {
component = DaggerGitHubAppComponent.builder()
.gitHubModule(new GitHubModule(this))
.build();
}
public GitHubAppComponent getComponent() {
return component;
}
abstract void setupComponent(GitHubAppComponent appComponent);
@Override
protected void onCreate(Bundle savedInstanceState) {
...
GitHubApp app = (GitHubApp) getApplication();
GutHubAppComponent component = app.getComponent();
setupComponent(component);
}
@Override
protected void setupComponent(GitHubAppComponent appComponent) {
ActivityComponent component = DaggerMainActivityComponent.builder()
.gitHubAppComponent(appComponent)
.activityModule(new ActivityModule(this))
.build()
component.inject(this);
}
我知道这看起来像是a$$中的一个难题,但是一旦你掌握了Dagger,你就会发现它是多么的简单和方便。除了注释之外,我认为你还缺少额外的设置:
GitHubApp.java
GitHubAppComponent component;
// call this inside onCreate()
private void setupComponent() {
component = DaggerGitHubAppComponent.builder()
.gitHubModule(new GitHubModule(this))
.build();
}
public GitHubAppComponent getComponent() {
return component;
}
abstract void setupComponent(GitHubAppComponent appComponent);
@Override
protected void onCreate(Bundle savedInstanceState) {
...
GitHubApp app = (GitHubApp) getApplication();
GutHubAppComponent component = app.getComponent();
setupComponent(component);
}
@Override
protected void setupComponent(GitHubAppComponent appComponent) {
ActivityComponent component = DaggerMainActivityComponent.builder()
.gitHubAppComponent(appComponent)
.activityModule(new ActivityModule(this))
.build()
component.inject(this);
}
以及活动组件,它需要在您创建的BaseActivity
上使用抽象方法:
BaseActivity.java
GitHubAppComponent component;
// call this inside onCreate()
private void setupComponent() {
component = DaggerGitHubAppComponent.builder()
.gitHubModule(new GitHubModule(this))
.build();
}
public GitHubAppComponent getComponent() {
return component;
}
abstract void setupComponent(GitHubAppComponent appComponent);
@Override
protected void onCreate(Bundle savedInstanceState) {
...
GitHubApp app = (GitHubApp) getApplication();
GutHubAppComponent component = app.getComponent();
setupComponent(component);
}
@Override
protected void setupComponent(GitHubAppComponent appComponent) {
ActivityComponent component = DaggerMainActivityComponent.builder()
.gitHubAppComponent(appComponent)
.activityModule(new ActivityModule(this))
.build()
component.inject(this);
}
然后,您的活动还应创建组件:
MainActivity.java
GitHubAppComponent component;
// call this inside onCreate()
private void setupComponent() {
component = DaggerGitHubAppComponent.builder()
.gitHubModule(new GitHubModule(this))
.build();
}
public GitHubAppComponent getComponent() {
return component;
}
abstract void setupComponent(GitHubAppComponent appComponent);
@Override
protected void onCreate(Bundle savedInstanceState) {
...
GitHubApp app = (GitHubApp) getApplication();
GutHubAppComponent component = app.getComponent();
setupComponent(component);
}
@Override
protected void setupComponent(GitHubAppComponent appComponent) {
ActivityComponent component = DaggerMainActivityComponent.builder()
.gitHubAppComponent(appComponent)
.activityModule(new ActivityModule(this))
.build()
component.inject(this);
}
我知道这看起来像是a$$中的一个难题,但是一旦你掌握了匕首,你就会发现它是多么的简单和方便。在你的活动组件中用无效注入(AppCompatActivity活动)
替换活动组件中的无效注入(MainActivity活动)
替换无效注入(AppCompatActivity活动)
使用无效注入(MainActivity活动)
发布您的GitHubApp类您的ActivityComponent
还应该为演示者定义一个方法。类似于MainPresenter presenter();
组件应该以抽象的方式反映模块的功能。我知道,这听起来是多余的。在ActivityComponent中
replacevoid inject(AppCompatActivity活动);
withvoid inject(MainActivity活动)
并让我知道它是否有效。@MuhammadBabar,根据您建议的更改和下面的代码,它现在可以工作了..非常感谢..我如何在您和chisko之间共享点?发布您的GitHubApp类您的ActivityComponent
还应该为演示者定义一个方法。类似于MainPresenter presenter();
组件应该以抽象的方式反映模块的功能。我知道,这听起来是多余的。在ActivityComponent中
replacevoid inject(AppCompatActivity活动);
withvoid inject(MainActivity活动)
,让我知道它是否有效。@MuhammadBabar,根据您建议的更改和下面的代码,它现在可以工作了。。非常感谢。。我如何在您和chisko之间共享点?但是,活动模块采用了一个this,这将指向活动,那么在GitHubApp.class中如何接受它?@Rat-a-tatatatouille更正了输入错误。这就是你的意思,对吗?//在onCreate()私有void setupComponent()内调用此函数{component=DaggerGitHubAppComponent.builder().activityModule(新AppModule(this)).build();}public GitHubAppComponent getComponent(){return component;}
->我指的是这个,很抱歉,我想我不理解这一部分,我的意思是你需要在你的GitubApp
类中调用setupComponent()
内部onCreate()
,所以setupComponent
,有方法activityModule(新的AppModule(这个))
,在当前代码库中,AppModule
->它是Acitivity模块
接受一个活动
,而不是一个应用程序类,但是,活动模块接受一个指向该活动的标记,那么在GitHubApp.class中如何接受该标记?@Rat-a-tatatratatouille更正了输入错误。这就是你的意思对吗?//在onCreate()私有void setupComponent()内部调用此函数{component=DaggerGitHubAppComponent.builder().activityModule(新AppModule(this)).build();}public GitHubAppComponent getComponent(){return component;}
->我指的是这个,很抱歉,我想我不理解这一部分,我的意思是你需要在你的GitubApp
类中调用setupComponent()
内部onCreate()
,所以setupComponent
,有方法activityModule(新的AppModule(这个))
,在当前代码库中,AppModule
->