Поле не вводится в проект Android Dagger

Я играю с Dagger на Android. Я создал модель UserPreference , модуль под названием PreferenceModule и другой класс UserPreferenceTest который является тестом PreferenceModule . У меня ниже 3 java-файлов

UserPreference.java

 package com.sigicn.preference; import javax.inject.Inject; import com.sigicn.commonmodels.Application; public class UserPreference { public String name, weiboAccount; @Inject public Application[] frequentlyUsedApps; } 

Затем PreferenceModule.java

 package com.sigicn.preference; import javax.inject.Singleton; import com.sigicn.commonmodels.Application; import com.sigicn.utils.MiscUtils; import dagger.Module; import dagger.Provides; @Module(library = true, complete = true) public class PreferenceModule { @Provides @Singleton UserPreference provideUserPreference() { UserPreference userPreference = new UserPreference(); userPreference.frequentlyUsedApps = provideApplications(); return userPreference; } @Provides @Singleton Application[] provideApplications() { return new Application[]{ new Application( MiscUtils.generateUUID(), "Youtube"), new Application( MiscUtils.generateUUID(), "Pixi") }; } } 

Затем UserPreferenceTest.java

 package com.sigicn.test.preference; import javax.inject.Inject; import com.sigicn.preference.PreferenceModule; import com.sigicn.preference.UserPreference; import dagger.Module; import dagger.ObjectGraph; import android.test.AndroidTestCase; public class UserPreferenceTest extends AndroidTestCase { @Module(injects = {UserPreference.class, UserPreferenceTest.class}, includes = PreferenceModule.class) static class TestModule { } ObjectGraph objectGraph; @Inject UserPreference userPreference; @Override protected void setUp() throws Exception { if (objectGraph == null) { objectGraph = ObjectGraph.create(new TestModule()); } super.setUp(); } public void testFrequentlyUsedApps() { UserPreference localUserPreference = objectGraph.get(UserPreference.class); assertNotNull(localUserPreference); assertEquals(localUserPreference.frequentlyUsedApps.length, 2); objectGraph.inject(this); assertNotNull(userPreference); assertEquals(userPreference.frequentlyUsedApps.length, 2); assertSame(localUserPreference, userPreference); assertSame(localUserPreference.frequentlyUsedApps, userPreference.frequentlyUsedApps); } } 

Но не знаю почему, что frequentlyUsedApps используемые пользователи UserPreference не вводятся, как ожидалось. Любая идея почему?

Обновить:

Я думаю, что выяснил причину. Это потому, что я вручную создаю UserPreference и использую его в провайдере. Если я удалю Провайдера для UserPreference и дам кинжал для его автоматического UserPreference , тогда поле frequentlyUsedApps используется. Так что я виноват в том, что плохо понимаю Кинжал .

Я думаю, вам нужно добавить некоторые вызовы ObjectGraph #.

В каждом классе, где у вас есть аннотация @Inject, вам также понадобится вызов метода ввода объекта ObjectGraph, который вы создали.

Некоторое время я боролся с этим. Я думаю, что основной шаблон:

  1. Аннотируйте свои поля, чтобы указать, что вы хотите их вводить
  2. Создайте модуль для «предоставления» экземпляров для этих @Injects
  3. Создайте граф где-нибудь (кажется, что большинство людей делают это в классе Application)
  4. В классах, которые вы хотите ввести материал из своего модуля, получите экземпляр графа и вызовите инъекцию (это).

Я начал использовать синглтон, а не класс Application, потому что по крайней мере на данный момент у меня есть некоторые места, которые я должен сам добавить в приложение.

Итак, вот что я сейчас делаю, что, кажется, работает довольно weill

 public class Injector { private static Injector mInjector; private ObjectGraph mObjectGraph; private MyApp mApp; private Injector() { } public static Injector getInstance() { if (mInjector == null) { mInjector = new Injector(); } return mInjector; } protected List<Object> getModules() { return Arrays.asList( new ApplicationModule(mApp), new AndroidModule(mApp) ); } public void inject(Object object) { getObjectGraph().inject(object); } public ObjectGraph getObjectGraph() { return mObjectGraph; } public void initialize(MyApp app) { mApp = app; mObjectGraph = ObjectGraph.create(getModules().toArray()); System.out.println(String.format("init object graph = %s",mObjectGraph.toString())); } } 

Тогда в моем классе приложения у меня есть такой конструктор:

 public MyApp() { System.out.println("myapp construtor"); Injector.getInstance().initialize(this); Injector.getInstance().inject(this); } 

Тогда, когда я хочу что-то ввести, я делаю это

 @Inject Bus mBus; public GcmBroadcastReceiver() { Injector.getInstance().inject(this); } 

У меня есть два модуля: один для производства и один для тестирования

В производстве это

 @Provides @Singleton public Bus provideBus () { return BusProvider.getInstance(); } 

И тест имеет это

 @Provides @Singleton public Bus provideBus () { return mock(Bus.class); } 
Intereting Posts
Android 7.0 (нуга) Режим Doze останавливает веб-службу Как вы используете TimerTask для запуска потока? Я хочу проанализировать API карт Google для обратного геокодирования в Android Android делает полноэкранный режим Dialog со строкой состояния, показывающей Функция замены строки не работает в android ScrollView vs RecyclerView для разных детей на Android USB Dongle Recognition в Android – Beaglebone Как запустить или запустить приложение внутри фрагмента Android? Библиотека Android Glide не работает с переходами общих элементов Как вернуть массив или другие типы элементов коллекции из плагина phonegap android Есть ли способ сохранить метаданные в манифестах Android в приватном пакете? Каковы использование основного, стандартного и запуска в файле манифеста в android Остановить Eclipse от открытия Logcat при запуске приложения для Android NullPointerException-: попытка вызвать метод интерфейса "android.view.View android.view.MenuItem.getActionView ()" в ссылке на нулевой объект Как заставить переполнение меню на Android-панели?