【问题标题】:Why class isn't injected to module?为什么类不注入模块?
【发布时间】:2019-10-17 13:10:29
【问题描述】:

我有一些 MVP 模式的 Group 模块。我刚开始学习 Dagger2,我希望 GroupComponent 将存储库注入到 Presenter 中,并为 GroupFragment 提供 Presenter。

这是我的仓库:

    public class GroupServerRepository {
        @Inject
        public GroupServerRepository(){}

我的演示者:

    public class GroupPresenter implements LifecycleObserver {
        private GroupServerRepository repository;
        @Inject
        public GroupPresenter(GroupServerRepository repository){
            this.repository = repository;
        }

组件:

    @Component
    interface GroupComponent{
        GroupPresenter getPresenter();
        GroupServerRepository getRepository();
    }

片段:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_group, container, false);

        GroupContracts.GroupComponent component = 
        DaggerGroupContracts_GroupComponent.create();
        presenter = component.getPresenter();

所以我希望在生成的组件类中有下一个代码:

    @Override
    public GroupPresenter getPresenter() {
        return new GroupPresenter(getRepository());
    }

    @Override
    public GroupServerRepository getRepository() {
        return new GroupServerRepository();
    }

但不是这个,我有下一个:

    @Override
    public GroupPresenter getPresenter() {
        return new GroupPresenter(new GroupServerRepository());
    }

    @Override
    public GroupServerRepository getRepository() {
        return new GroupServerRepository();
    }

我试图重建项目,但没有帮助。

【问题讨论】:

  • 我相信您需要在 GroupServerRepository 类中添加范围注释,例如@Singleton。然后 dagger 每次都会重用同一个实例。

标签: java android dagger


【解决方案1】:

就像 Jannik 指出的那样,存在范围界定问题。每次您只使用@Inject 或@Provides 时,都会创建一个新实例。你需要有一些范围。 @Singleton 为您提供了开箱即用的范围,但这不是您所需要的。您需要自定义范围,例如:

@ActivityScope

@FragmentScope

等等。

这是一个例子:

https://github.com/google/iosched/blob/master/shared/src/main/java/com/google/samples/apps/iosched/shared/di/ActivityScoped.java

您可以检查项目本身,这是正确使用 Dagger2 的一个很好的例子。

https://github.com/google/iosched

这是一篇关于该应用的文章:

https://medium.com/@JoseAlcerreca

但请阅读作用域的工作原理。

https://proandroiddev.com/dagger-2-component-relationships-custom-scopes-8d7e05e70a37

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多