Intereting Posts
Ошибка libpng: Не отображается файл PNG Ошибка в Android Studio Curiosity Down / Up Swipe Анимация и фрагменты Population Based On posts date Как отправить электронную почту со ссылкой на приложение для Android Как получить общий объем оперативной памяти устройства? Невозможно изменить целевой API в AVD Manager ScrollView сражается со свитком TimePicker, Timepicker не прокручивается в результате Как использовать Android-аудио с низкой задержкой Как настроить эмулятор под управлением API 25 с использованием матрицы построения на Travis CI? Ошибка Android Drawer Drawer с использованием образца Почему дополнительный фрагмент FrameLayout создан для фрагментов? Android получить все контакты Как я могу аннотировать мой метод для возврата типа видимости int в Android? Изменить цвет границы edittext Как перемещать маркер вдоль полилинии с помощью карты google Лучший способ комбинировать целые флаги с использованием Kotlin?

Dagger2 – null вместо введенного объекта

Для того, чтобы сделать вещи простыми, предположим, что я хочу ввести EmailValidator из валидаторов apache в свою деятельность:

public class MainActivity extends FragmentActivity { @Inject EmailValidator emailValidator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 

У меня есть класс MainModule:

 @Module public class MainModule { @Provides public EmailValidator providesEmailValidator() { return EmailValidator.getInstance(); } } 

И интерфейс MainComponent:

 @Singleton @Component(modules = MainModule.class) public interface MainComponent { EmailValidator getEmailValidator(); } 

При попытке использовать мой валидатор в действии я получаю исключение nullpointer:

 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference 

Очевидно, что я что-то упускаю. Я знаю, что кинжал создает для меня компонентную реализацию. Должен ли я использовать его? Как?

Если в моем методе onCreate я сделаю следующее:

  emailValidator = Dagger_MainComponent.create().getEmailValidator(); 

То все работает нормально.

Но я хочу иметь возможность использовать @Inject-аннотацию в любом месте (вероятно, на setter / constructor вместо поля).

Что мне не хватает?

Я сделал что-то подобное с кинжалом1, и это сработало. Конечно, мне нужно было вызвать ObjecGraph.inject(this) в ObjecGraph.inject(this) . Каков эквивалент кинжала?

РЕДАКТИРОВАТЬ:

Хорошо, поэтому я нашел решение. Если у кого-нибудь будет такая проблема, есть некоторые фрагменты:

1) Я создал класс приложения:

 public class EmailSenderApplication extends Application { private MainComponent component; @Override public void onCreate() { super.onCreate(); component = Dagger_MainComponent .create(); component.inject(this); } public MainComponent component() { return component; } } 

2) В AndroidManifest.xml:

 <application android:name=".EmailSenderApplication" ... 

3) И, наконец, в классе активности, где я хочу вставить некоторые компоненты, эти две уродливые черты:

 component = ((EmailSenderApplication) getApplication()).component(); component.inject(this); 

Solutions Collecting From Web of "Dagger2 – null вместо введенного объекта"

Похоже, вам нужно создать свой компонент так:

 component = Dagger_ MainComponent.builder() .mainModule(new MainModule()) .build(); 

Как правило, вы делаете это в методе onCreate вашего приложения таким образом .

Один хороший ресурс, который может вам помочь, – это примеры приложений в репозитории Dagger 2 .

Я также нашел этот PR полезным, от предлагаемого обновления к образцу приложения u2020 от Jake Wharton (от главного инженера Dagger 2). Он дает хороший обзор изменений, которые вам нужно сделать при переходе от кинжала 1 к 2, и, по-видимому, это то, на что он указывает людей .