gpt4 book ai didi

android - 如何将 Activity 注入(inject)到正在注入(inject) Activity 的对象中?

转载 作者:可可西里 更新时间:2023-11-01 11:42:16 26 4
gpt4 key购买 nike

我有这个模块:

@Module
public class UserProfileModule {

@Provides
@Singleton
UserProfileController providesUserProfileController() {
return new UserProfileController();
}

}

和这个组件:

@Component(modules = {UserProfileModule.class})
@Singleton
public interface AppComponent {

void inject(UserProfileActivity activity);

}

到目前为止,在我的UserProfileActivity 中,我可以@Inject一个UserProfileController。但是现在,我需要将 UserProfileActivity 注入(inject) Controller 。我的意思是,互相注入(inject)。

我可以通过在 UserProfileActivity 中调用 UserProfileController setter 来实现:setActivity(this);,但如果可以自动。

如何实现?

谢谢。

最佳答案

对于初学者:将其添加到构造函数中。然后声明该依赖项。

@Provides
@Singleton
UserProfileController providesUserProfileController(UserProfileActivity activity) {
return new UserProfileController(activity);
}

这样做之后,dagger 会提示无法提供 UserProfileActivity,除非您已经这样做了。如果不这样做,请添加另一个模块,或者只提供来自同一模块的依赖项。接下来是实际实现,首先我们需要修复您的代码。

@Singleton 依赖于层次结构的top。您不能——或者至少不应该——对带注释的@Singleton 对象具有 Activity 依赖性,因为这可能会导致难闻的气味和/或内存泄漏。引入自定义作用域 @PerActivity 以用于 Activity 生命周期内的依赖项。

@Scope
@Retention(RUNTIME)
public @interface PerActivity {}

这将允许对象的正确范围。 请同时引用一些关于 Dagger 的教程,因为这是一个非常重要的问题,并且在一个答案中涵盖所有内容会太多。例如Tasting dagger 2 on android

以下通过扩展您的模块使用上述 2 个选项的后一种方法:

@Module
public class UserProfileModule {

private final UserProfileActivity mActivity;

public UserProfileModule(UserProfileActivity activity) {
mActivity = activity;
}

@Provides
@PerActivity
UserProfileActivity provideActivity() {
return mActivity;
}

@Provides // as before
@PerActivity
UserProfileController providesUserProfileController(UserProfileActivity activity) {
return new UserProfileController(activity);
}

}

如果您现在使用您的组件 Builder,您可以创建一个新的模块实例,并将 Activity 作为参数。然后将正确提供依赖项。

关于android - 如何将 Activity 注入(inject)到正在注入(inject) Activity 的对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802091/

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