如何将活动注入到要注入到活动的对象



我有这个模块:

@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注入控制器。我的意思是,互相注射。

我可以通过在 UserProfileActivity 中调用一个UserProfileController二传手来做到这一点:setActivity(this); ,但如果可以自动就好了。

如何实现这一目标?

谢谢。

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

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

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

@Singleton是对层次结构顶部的依赖关系。您不能(或至少不应该)对@Singleton注释对象具有活动依赖关系,因为这可能会导致难闻的气味和/或内存泄漏。引入自定义范围@PerActivity,用于活动生命周期内的依赖项。

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

这将允许正确限定对象范围。另请参阅一些关于dagger的教程,因为这是一个非常重要的问题,在一个答案中涵盖所有内容就太多了。 例如,在安卓上品尝dagger 2

下面通过扩展模块来使用上述 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则可以使用活动作为参数创建模块的新实例。然后,将正确提供依赖项。

最新更新