Dagger 2在create方法

时间:2018-04-04 06:59:52

标签: android dagger-2

我无法理解我在这里做错了什么

启动活动:

public class SplashActivity extends BaseActivity implements SplashView {

    @Inject
    SplashPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_with_di);
        presenter.getAppVersion();
    }
}

组件:

@Component(modules = SplashModule.class)
public interface AppComponent {
    SplashWithDiPresenter getSplashWithDiPresenter();
}

启动模块:

@Module(includes = RetrofitModule.class)
public class SplashModule {

    @Provides
    SplashPresenter provideSplashPresenter(final SplashInteractorImpl interactor){
        return new SplashPresenterImpl(interactor);
    }

    @Provides
    SplashInteractor providesSplashInteractor(final ApiInterface apiInterface){
        return new SplashWithDiInteractorImpl(apiInterface);
    }
}

onCreate()

中调用此方法的应用程序类内部
private void createComponent() {
        appComponent = DaggerAppComponent.builder()
                .splashModule(new SplashModule())
                .build();

    }

在create方法

上的Splash活动上获取空对象引用

- > presenter.getAppVersion();

2 个答案:

答案 0 :(得分:2)

您已注入应用程序依赖项,现在需要对SplashActivity依赖项执行相同操作。所以你需要为你的活动创建一个新的组件,比如SplashComponent,然后像这样添加inject方法:

@PerActivity
@Component(modules = SplashModule.class, dependencies = AppComponent.class)
public interface SplashComponent {
    public void inject(SplashActivity activity);
}

然后在onCreate方法的SplashActivity中添加如下注入:

public class SplashActivity extends BaseActivity implements SplashView {

    @Inject
    SplashPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_with_di);

        DaggerSplashComponent.builder()
                .appComponent(getAppication().getAppComponent())
                .splashModule(new SplashModule())
                .build()
                .inject(this);

        presenter.getAppVersion();
    }
}

注意,只有在使用inject方法注入依赖项后才需要调用presenter的方法!

答案 1 :(得分:0)

理想情况下,您应该考虑使用子组件来注入Android组件(活动,片段,服务......)。它非常简单,避免将Injector组件与Android组件耦合,从而可以测试这些类并切换Espresso测试的组件。

dagger-android个代码添加到您的项目(com.google.dagger:dagger-android-support:2.x, com.google.dagger:dagger-android-processor:2.x

然后创建一个抽象的DepsModule模块,例如 -

@Module
public abstract class DepsModule {

    @PerActivity
    @ContributesAndroidInjector(modules={SplashModule.class})
    SplashActivity provideSplashInjector()
}

并将App Component更改为包含AndroidSupportInjectionModule.class & DepsModule.class,您应该从列表中删除SplashModule.classs以避免重新绑定错误。

现在就像向App类注入DispatchingAndroidInjector<Activity>实例并实现HasActivityInjector接口以返回调度注入器一样简单。

现在在SplashActivity之前调用super.onCreate()来电AndroidSupportInjection.inject(this)

@ContribbutesAndroidInjector自动告诉dagger为SplashActivity创建一个子组件,并将注入器工厂与DispatchingAndroidInjector<Activity>绑定,从而不需要样板子组件类

可以将用于不同活动的其他子组件安装添加到DepsModule,以便以类似的方式注入它们。

这也有助于范围隔离,因为暴露浮动活动对整个应用程序组件的绑定并不是很好

希望我能提供帮助。有关使用Dagger 2

的更多信息,请访问dagger 2 android docs