【问题标题】:I don't know why the object injected by dagger2 is null in presenter我不知道为什么 dagger2 注入的对象在presenter中为null
【发布时间】:2016-11-15 03:32:20
【问题描述】:

不知道为什么 dagger2 注入的 MainRankPresenter.java 的 loginResponseHandler 在 MainRankPresenter 中为 null。 我只想注入到现场进行现场注入。 我应该以其他方式代替现场注入吗? 请告诉我如何解决它。

BBBApplication.java

public class BBBApplication extends MultiDexApplication
{
    ...
    @Override
    public void onCreate() {
        super.onCreate();

        initAppComponent();
    }

    private void initAppComponent() {
        this.appComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();
    }

    public static BBBApplication get(Context ctx) {
        return (BBBApplication) ctx.getApplicationContext();
    }
    public AppComponent getAppComponent() {
        return this.appComponent;
    }
    ...
}

AppModule.java

@Module
public class AppModule {
    private BBBApplication application;

    public AppModule(BBBApplication application) {
        this.application = application;
    }

    @Provides
    @Singleton
    public Application provideApplication() {
        return this.application;
    }

    @Provides
    @Singleton
    public Resources provideResources() {
        return this.application.getResources();
    }

    @Provides`enter code here`
    @Singleton
    public SharedPreferences provideSharedPreferences() {
        return PreferenceManager.getDefaultSharedPreferences(this.application);
    }
}

AppComponent.java

@Singleton
@Component(modules = {AppModule.class, ServiceModule.class})
public interface AppComponent {
    RankFragmentComponent plus(RankFragmentModule module);

    Application application();
    Resources resources();
}

RankFragmentModule.java

@Module
public class RankFragmentModule {

    private RankFragment rankFragment;

    public RankFragmentModule(RankFragment rankFragment) {
        this.rankFragment = rankFragment;
    }

    @Provides
    @ActivityScope
    public LoginResponseHandler provideLoginResponseHandler() {
        return new LoginResponseHandler(this.rankFragment);
    }

    @Provides
    @ActivityScope
//    @Named("rankFragment")
    public RankFragment provideRankFragment() {
        return this.rankFragment;
    }

    @Provides
    @ActivityScope
    public MainRankPresenter provideMainRankPresenter(RankFragment rankFragment) {
        return new MainRankPresenter(new MainRankViewOps(rankFragment));
    }

}

RankFragmentComponent.java

@ActivityScope
@Subcomponent(modules = {RankFragmentModule.class})
public interface RankFragmentComponent {
    void inject(RankFragment rankFragment);
}

RankFragment.java

public class RankFragment extends Fragment {

    @Inject
    MainRankPresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BBBApplication.get(getContext())
                .getAppComponent()
                .plus(new RankFragmentModule(this))
                .inject(this);
        presenter.test();
    }

MainRankPresenter.java

public class MainRankPresenter implements Presenter {

    private MainRankViewOps viewOps;

    @Inject
    LoginResponseHandler loginResponseHandler;

    @Inject
    public MainRankPresenter(MainRankViewOps viewOps) {
        this.viewOps = viewOps;
    }

    @Override
    public void test() {
        Log.d(Constants.TAG_DEBUG, "=== presenter test" + this.toString());
        Log.d(Constants.TAG_DEBUG, "=== " + loginResponseHandler.toString());
        this.viewOps.initViewOps();
    }
}

MainRankViewOps.java

public class MainRankViewOps implements ViewOps {

    RankFragment fragment;

    @Inject
    public MainRankViewOps(RankFragment fragment) {
        this.fragment = fragment;
    }

    @Override
    public void initViewOps() {
        Log.d(Constants.TAG_DEBUG, "=== view ops" + this.toString());
        Log.d(Constants.TAG_DEBUG, "=== " + fragment.toString());
    }
}

【问题讨论】:

    标签: android mvp dagger


    【解决方案1】:

    Dagger 2 的注入不是递归的。因此,当您在RankFragment 中调用inject(this) 时,只会注入该片段的@Inject 注释字段。 Dagger 2 不会在注入的对象中搜索@Inject 注解。

    一般来说,您应该尝试将依赖注入框架的使用限制在 Android 框架为您实例化的“顶级”组件(活动、片段、服务等)。在您自己实例化的对象中(例如MainRankPresenter),您应该使用其他不涉及外部框架的 DI 技术(例如,将依赖项注入到构造函数中)。

    【讨论】:

    • 感谢您的帮助。我解决了我添加了 this.viewOps.fragment.getRankFragmentComponent().inject(this);到 MainRankPresenter 构造函数。
    【解决方案2】:

    因为你@ProvidesMainRankPresenter,Dagger 不会注入它:你对此负责。您可以将提供的方法传递给MembersInjector si,如果对象在返回之前注入字段,则可能会更好地重构您删除的模块,并让 Dagger 处理注入(您已经拥有所有需要的@Inject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多