Страницы

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

понедельник, 27 мая 2019 г.

Как правильно использовать 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
Где ошибка?


Ответ

Вам надо создать AppComponent в MainActivity
appComponent = DaggerAppComponent.builder().modelModule(new ModelModule()).build();
и сделать appComponent.inject(this)

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

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