我无法理解我在这里做错了什么
启动活动:
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();
答案 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