匕首 2 @Inject return 空
Dagger 2 @Inject return Null
我正在使用 java 创建多模块 android 项目。当我注入 class 时,我得到了 Null
。
以下是我的代码。
SignupComponent.class
@FeatureScope
@Subcomponent(modules = SignupModule.class)
public interface SignupComponent {
@Subcomponent.Factory
interface Factory{
SignupComponent create();
}
void inject(Activity_Signup activity_signup);
SignupModule.class
@Module
public class SignupModule {
@FeatureScope
@Provides
public SignupContract.Presenter providePresenter(){
return new SignupPresenter();
}
}
Activity_Signup.class
SignupComponent signupComponent = ((SignupComponentProvider) getApplicationContext())
.provideSignupComponent();
//Inject the view
signupComponent.inject(this);
SignupPresenter.class
public class SignupPresenter implements SignupContract.Presenter {
// this injection return Null
@Inject
public SignupUseCase signupUseCase;
}
SignupUseCase.class
public class SignupUseCase {
@Inject
public SignupUseCase(){}
...
}
为什么我得到 NPE
?
编辑
SignupModule.class
@Module
public class SignupModule {
@FeatureScope
@Provides
public SignupContract.Presenter providePresenter(){
return new SignupPresenter();
}
@FeatureScope
@Provides
public SignupUseCase provideUseCase(){
return new SignupUseCase();
}
}
@FeatureScope
@Provides
public SignupContract.Presenter providePresenter(){
return new SignupPresenter();
}
当您调用 new SignupPresenter()
时,Dagger 并未实例化该对象,您是。因此,Dagger 不会注入 @Inject
-annotated 字段,因为它假设您想要的对象与您返回的对象完全一样。
如果您希望 Dagger 填充 SignupUseCase,您需要执行以下操作之一:
让 Dagger 创建 SignupPresenter 并在您的 @Provides
方法中接收它。您需要向 SignupPresenter 添加一个带 @Inject
注释的构造函数,可能没有参数。
@FeatureScope
@Provides
public static SignupContract.Presenter providePresenter(SignupPresenter presenter) {
return presenter;
}
让 Dagger 创建 SignupPresenter 并使用 @Binds
方法将其绑定到 SignupContract.Presenter。这需要 SignupPresenter 上的 @Inject
注释构造函数,还需要使您的模块成为抽象的 class.
@FeatureScope
@Binds
abstract SignupContract.Presenter providePresenter(SignupPresenter presenter);
使用 MembersInjector,您可以通过注入获得它。你可能不想要这个,除非你收到一个 SignupPresenter 的实例,你可以添加 @Inject
方法和字段,但 Dagger 不能创建。
@FeatureScope
@Provides
public static SignupContract.Presenter providePresenter(
MembersInjector<SignupPresenter> injector) {
SignupPresenter presenter = new SignupPresenter();
injector.injectMembers(presenter);
return presenter;
}
我正在使用 java 创建多模块 android 项目。当我注入 class 时,我得到了 Null
。
以下是我的代码。
SignupComponent.class
@FeatureScope
@Subcomponent(modules = SignupModule.class)
public interface SignupComponent {
@Subcomponent.Factory
interface Factory{
SignupComponent create();
}
void inject(Activity_Signup activity_signup);
SignupModule.class
@Module
public class SignupModule {
@FeatureScope
@Provides
public SignupContract.Presenter providePresenter(){
return new SignupPresenter();
}
}
Activity_Signup.class
SignupComponent signupComponent = ((SignupComponentProvider) getApplicationContext())
.provideSignupComponent();
//Inject the view
signupComponent.inject(this);
SignupPresenter.class
public class SignupPresenter implements SignupContract.Presenter {
// this injection return Null
@Inject
public SignupUseCase signupUseCase;
}
SignupUseCase.class
public class SignupUseCase {
@Inject
public SignupUseCase(){}
...
}
为什么我得到 NPE
?
编辑
SignupModule.class
@Module
public class SignupModule {
@FeatureScope
@Provides
public SignupContract.Presenter providePresenter(){
return new SignupPresenter();
}
@FeatureScope
@Provides
public SignupUseCase provideUseCase(){
return new SignupUseCase();
}
}
@FeatureScope
@Provides
public SignupContract.Presenter providePresenter(){
return new SignupPresenter();
}
当您调用 new SignupPresenter()
时,Dagger 并未实例化该对象,您是。因此,Dagger 不会注入 @Inject
-annotated 字段,因为它假设您想要的对象与您返回的对象完全一样。
如果您希望 Dagger 填充 SignupUseCase,您需要执行以下操作之一:
让 Dagger 创建 SignupPresenter 并在您的
@Provides
方法中接收它。您需要向 SignupPresenter 添加一个带@Inject
注释的构造函数,可能没有参数。@FeatureScope @Provides public static SignupContract.Presenter providePresenter(SignupPresenter presenter) { return presenter; }
让 Dagger 创建 SignupPresenter 并使用
@Binds
方法将其绑定到 SignupContract.Presenter。这需要 SignupPresenter 上的@Inject
注释构造函数,还需要使您的模块成为抽象的 class.@FeatureScope @Binds abstract SignupContract.Presenter providePresenter(SignupPresenter presenter);
使用 MembersInjector,您可以通过注入获得它。你可能不想要这个,除非你收到一个 SignupPresenter 的实例,你可以添加
@Inject
方法和字段,但 Dagger 不能创建。@FeatureScope @Provides public static SignupContract.Presenter providePresenter( MembersInjector<SignupPresenter> injector) { SignupPresenter presenter = new SignupPresenter(); injector.injectMembers(presenter); return presenter; }