gpt4 book ai didi

android - 不知道为什么dagger2注入(inject)的对象在presenter中为null

转载 作者:行者123 更新时间:2023-11-29 01:14:44 25 4
gpt4 key购买 nike

不知道为什么dagger2注入(inject)的MainRankPresenter.java的loginResponseHandler在MainRankPresenter中为null。我只想注入(inject)字段进行字段注入(inject)。我应该做其他方式而不是现场注入(inject)吗?请让我知道如何解决它。

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);
}
}

应用组件.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());
}
}

最佳答案

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

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

关于android - 不知道为什么dagger2注入(inject)的对象在presenter中为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40601539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com