#java #android #dagger2
Нашел код и хочу разобраться как работает Dagger2 Вот я слепил такой простой пример и не могу понять как его соединить чтоб он работал Есть MainActivity public class MainActivity extends AppCompatActivity { @Inject protected ApiInterface apiInterface; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (apiInterface == null){ Log.e("TAG", "apiInterface == null"); }else { Log.e("TAG", "apiInterface != null : " + apiInterface.value); } } } Я хочу инжекнуть в переменную apiInterface ссылку на класс. Для этого я указываю ключевое слово @Inject. Теперь, чтоб Dagger знал что инжекать туда я слепил вот такой класс @Module class ModelModule { @Provides @Singleton ApiInterface provideApiInterface() { return ApiModule.getApiInterface(); } } Теперь я так понимаю Dagger когда увидит в MainActivity слово @Inject и тип переменной(насколько я понимаю), то он пойдет искать кто ему возвращает такой тип и найдет класс ModelModule в котором метод provideApiInterface() возвращает то что нужно apiInterface. Вот кстати для ясности этот класс class ApiInterface { int value; ApiInterface() { this.value = 4; } } Но теперь, чтоб все заработало нужно указать @Component в котором указывается от куда брать обьекты и куда внедрять... Но это теория, так как я не понимаю зачем это нужно... Мы и так указали уже от куда брать обьекты, а словом @Inject мы указываем куда внедрять... Зачем еще что то нужно? Вот тут и есть проблема, обьясните зачем нужен @Component и как его составить для конкретного примера, чтоб все заработало и я мог в MainActivity получить число 4... ПРАВКА Вот я слепил вот такой компонент @Singleton @Component(modules = {ModelModule.class}) interface AppComponent { void inject(ApiInterface apiInterface); } В MainActivity я все равно получаю null Где ошибка?
Ответы
Ответ 1
Вам надо создать AppComponent в MainActivity appComponent = DaggerAppComponent.builder().modelModule(new ModelModule()).build(); и сделать appComponent.inject(this)Ответ 2
Всё верно, без компонента никуда, так как без него твой класс, который зашивает зависимости не понимает откуда их брать. Если ты передаёшь в компонент ссылку на себя же (например через метод inject()), то компонент просматривает твой класс, распознает все поля которые нужно заинжектить и передает запрос в нужный Module, напомню что модулей может быть несколько, которые могут иметь одинаковые возвращаемые значения, а компонент указывает именно тот, который нужен тебе в данной ситуации Как написал комментатор выше в твоём классе нужно создать компонент и передать в метод компонента ссылку на твой класс. Необходимый код как раз написали выше
Комментариев нет:
Отправить комментарий