匕首 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;
    }