【问题标题】:Inject field of class that is instantiated before the Dagger Component在 Dagger 组件之前实例化的类的注入字段
【发布时间】:2018-08-25 15:14:52
【问题描述】:

我有一个类A 有一个字段private SomeValue someValue。我的 Dagger @Component 类被称为 MyApplicationComponent

A 类在 DaggerMyApplicationComponent 之前实例化。所以不知道怎么注入someValue

我不能使用构造函数注入,因为A 是在组件之前创建的。

我相信我也不能使用字段注入,因为在A 中我需要调用MyApplicationComponent.inject(this),但在A 中我不知道MyApplicationComponent 什么时候会被实例化,所以我不知道什么时候拨打.inject

我尝试使用setter注入,将此方法添加到A

@Inject
public void setSomeValue(SomeValue someValue) {
    log.info("in setter injector!");
    this.someValue = someValue;
}

另外,我将此添加到MyApplicationComponent

void inject(A a);

但是,setter 方法永远不会被调用。

为什么不调用这个方法?

Dagger 是如何做 setter 注入的?

一旦DaggerMyApplicationComponent 被实例化,有没有办法告诉Dagger 将someValue 注入A

【问题讨论】:

    标签: android dagger-2


    【解决方案1】:

    使用方法注入,当对象被实例化时,dagger 会调用一次用@inject 注解注解的方法。这意味着这不是您所需要的。您可以定义一个通用接口,由您的组件接口 (MyApplicationComponent) 扩展它。

    interface Injector<T> {
        void inject(T instance);
    }
    
    
    public interface MyApplicationComponent extends Injector<A>{
    
        MyApplicationComponent getMyApplicationComponent();
    
        void inject(A instance);
    }
    

    然后在你的类中创建一个方法,像这样:

    public class A {
    
    
        private SomeValue someValue
    
        public void setSomeValue(Injector<A> com) {
           com.inject(this);
        }
    }
    

    最后,当你的组件被创建时,调用 setSomeValue 方法并将组件对象传递给它。

    A obj=new A();
    
    MyApplicationComponent component=DaggerMyApplicationComponent.create();
    
    obj.setSomeValue(component);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2019-11-28
      相关资源
      最近更新 更多