Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Как правильно использовать Dagger2?

#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, напомню что модулей может быть несколько, которые могут иметь одинаковые возвращаемые значения, а компонент указывает именно тот, который нужен тебе в данной ситуации Как написал комментатор выше в твоём классе нужно создать компонент и передать в метод компонента ссылку на твой класс. Необходимый код как раз написали выше

Комментариев нет:

Отправить комментарий