gpt4 book ai didi

android - Dagger 2方法注入(inject)?

转载 作者:行者123 更新时间:2023-11-29 23:49:26 32 4
gpt4 key购买 nike

我有 2 个类,我希望对其进行依赖注入(inject)。基本上两者都需要彼此的对象来执行某些任务。

头等舱

public class AppMobilePresenter {
AppPresenter appPresenter;

@Inject
public AppMobilePresenter(AppPresenter appPresenter) {
this.appPresenter = appCMSPresenter;
}
}

它的模块

@Module
public class AppMobilePresenterModule {
@Provides
@Singleton
public AppMobilePresenter providesAppMobilePresenter(AppPresenter appPresenter) {
return new AppMobilePresenter(appPresenter);
}
}

二等

public class AppPresenter {
AppMobilePresenter appMobilePresenter;

@Inject
public AppPresenter() {
}

@Inject
void setAppMobilePresenter(AppMobilePresenter appMobilePresenter){
this.appMobilePresenter=appMobilePresenter;
}
}

它的模块

@Module(includes = { AppMobilePresenterModule.class})
public class AppPresenterModule {
@Provides
@Singleton
public AppPresenter providesAppPresenter() {
return new AppPresenter();
}
}

两者都有一个共同的组件

@Singleton
@Component(modules = {AppPresenterModule.class})
public interface AppPresenterComponent {
AppPresenter appPresenter();
}

从我的应用程序类构建组件并运行应用程序后,我在 AppPresenter 类中获得了 AppMobilePresenter 对象 null。方法注入(inject)还需要做些什么吗?

最佳答案

当您调用构造函数时,方法注入(inject)不会发生,就像您在@Provides 方法中所做的那样;如果您希望方法注入(inject)发生,Dagger 需要在其生成的代码中调用带有 @Inject 注释的构造函数。

看起来您更喜欢构造函数注入(inject),这无论如何都更安全,但正在尝试方法注入(inject)只是为了避免依赖循环。不幸的是,那行不通。相反,切换回构造函数注入(inject)和 use the technique shown here :

@Singleton
public class AppMobilePresenter {
AppPresenter appPresenter;

@Inject
public AppMobilePresenter(AppPresenter appPresenter) {
this.appPresenter = appCMSPresenter;
}
}

@Singleton
public class AppPresenter {
Provider<AppMobilePresenter> appMobilePresenterProvider;

@Inject
public AppPresenter(Provider<AppMobilePresenter> appMobilePresenterProvider) {
this.appMobilePresenterProvider = appMobilePresenterProvider;
}
}

上面的代码可以使用相同的组件,并且不需要任何模块。需要注意的是,要从 AppPresenter 访问 AppMobilePresenter,您需要调用 appMobilePresenterProvider.get() ,您可以在除构造函数和@Inject 方法之外的任何地方调用它。这样就解决了构造问题:否则Dagger在没有先创建AppPresenter的情况下无法创建AppMobilePresenter,在没有先创建AppMobilePresenter的情况下也无法创建AppPresenter。不过,它可以创建一个 Provider,并在您稍后调用它时提供实例。

如果 future 的读者真的需要字段或方法注入(inject),他们可以在删除模块并切换到方法注入(inject) Provider<AppMobilePresenter> 时单独使用 @Inject 构造函数和方法。 ,这是必要的,因为方法注入(inject)与构造函数注入(inject)具有相同的构造顺序依赖循环问题。

关于android - Dagger 2方法注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51062249/

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