【问题标题】:Presenter is null on injecting in activityPresenter 在注入活动时为空
【发布时间】: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


【解决方案1】:

除了 cmets,我认为您还缺少其他设置:

GitHubApp.java

GitHubAppComponent component;

// call this inside onCreate()
private void setupComponent() {
    component = DaggerGitHubAppComponent.builder()
        .gitHubModule(new GitHubModule(this))
        .build();
}

public GitHubAppComponent getComponent() {
     return component;
}

以及活动组件,它需要在您创建的BaseActivity 上使用抽象方法:

BaseActivity.java

abstract void setupComponent(GitHubAppComponent appComponent);

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    GitHubApp app = (GitHubApp) getApplication();
    GutHubAppComponent component = app.getComponent();
    setupComponent(component);
}

那么,你的活动也应该创建组件:

MainActivity.java

@Override
protected void setupComponent(GitHubAppComponent appComponent) {
    ActivityComponent component = DaggerMainActivityComponent.builder()
        .gitHubAppComponent(appComponent)
        .activityModule(new ActivityModule(this))
        .build()
    component.inject(this);
}

我知道这对 a$$ 来说可能看起来很痛苦,但一旦你掌握了 Dagger,你就会发现它是多么简单方便。

【讨论】:

  • 但是,活动模块需要一个 this,它会指向活动,那么在 GitHubApp.class 中如何接受呢?
  • @Rat-a-tat-a-tatRatatouille 更正了错字。你说的对吗?
  • // call this inside onCreate() private void setupComponent() { component = DaggerGitHubAppComponent.builder() .activityModule(new AppModule(this)) .build(); } public GitHubAppComponent getComponent() { return component; } -> 我指的是这个,对不起,我想我不明白这部分
  • 我的意思是你需要在onCreate() 中调用setupComponent() GitHubApp
  • 是的,所以setUpComponentactivityModule(new AppModule(this)) 方法,在当前代码库中,AppModule -> 即Acitivity Module 接受activity,而不是应用程序类跨度>
【解决方案2】:

在您的 ActivityComponent 中,将 void inject(AppCompatActivity activity) 替换为 void inject(MainActivity activity)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多