Dagger2, как выполнить внедрение конструктора конструктора по умолчанию - PullRequest
0 голосов
/ 25 июня 2019

Вот сценарий. Допустим, есть класс А

Class A{

@Inject
public A(){}

}

И в моей деятельности

 public class MainActivity extends Activity{

    @Inject
    A a;

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    }
}

Как ввести в этом сценарии.

1 Ответ

3 голосов
/ 25 июня 2019

Хорошо, прежде всего, вам нужен модуль:

@Module
class SomeModule{
  @SomeScope
  @Provides
  A proivdeTheAInstance(){
   return new A();
  }
}

Тогда ваш компонент:

@SomeScope
@Component(modules = {A.class}, dependencies={HigherLowerDependencyComponent.class})
interface SomeComponent{
 void inject(MainActivity activity);
}

После этого в вашей деятельности, после того, как вы выполнили сборку, в onCreate

DaggerSomeComponent.builder().higherLowerDependencnyComponent(implementationHere).build().inject(this)

Чем вы можете @Inject A

Но есть одна проблема. Внедрение в конструктор не работает так. Чтобы выполнить внедрение конструктора, ваш конструктор A() должен иметь хотя бы одну зависимость. Аннотация @Inject к этому конструктору вызывает не A(), а его зависимости, которые в вашем случае будут равны 0, что делает ненужным @Inject в вашем конструкторе A(). Ваш вопрос будет в силе, если ваш A конструктор будет выглядеть так:

    @Inject
    public A(SomeDependency dependency){
     this.someDependency = dependency;
    }

SomeDependency будет также предоставлено в модуле:

@Module
class SomeModule{
  @SomeScope
  @Provides
  A proivdeTheAInstance(SomeDependency someDependency){ //now dagger will look to find this one
   return new A();
  }

@SomeScope
  @Provides
  SomeDependency proivdeSomeDependencyInstance(){ //which is provided here 
   return new SomeDependency();
  }
}

И тебе хорошо идти, как было:

class A{
private SomeDependency someDependency;
 @Inject
 public A(SomeDependency someDependency){ //the inject will require the SomeDependency
  this.someDependency = someDependency;
  }
}

EDIT: Если кинжал уже знает, как предоставить экземпляр, модуль не нужен, вы можете просто выполнить @Inject над конструктором класса A():

class A{
    @Inject
    public A(){
    }
}
...