Intereting Posts
Неудачная ошибка связи при инициализации Myo hub на Android Передавать растровое изображение из одной активности в другую Как остановить анимацию (cancel () не работает) Поместите 3 кнопки в LinearLayout, чтобы занять равное количество места Служба Android перестает работать, когда телефон заблокирован Android-эмулятор не будет закрыт AlarmClock для начинающих – Android Настройка макета для использования в качестве пустого представления для ListView в случае, когда адаптер имеет нулевые элементы в Activity Аутентификация Gmail Imap с помощью AccountManager Особенности использования Looper.prepare () в Android Как отладить веб-сайт на Android? Код для загрузки видео с Youtube на Java, Android Ярлык для методов переопределения в Android Studio Каково максимальное количество символов, которое может отображаться в уведомлении Android и iOS? Android 6.0 требует перезагрузки после предоставления разрешения пользователя во время выполнения

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, и, по-видимому, это то, на что он указывает людей .