2016-03-28 2 views
2

Был заблокирован на это в течение нескольких дней.Inject in Dagger возвращает null

По какой-то причине мое поле «приложение» в AndroidModule.java имеет значение null после инъекции.

AndroidModule.java

@Module(
     library = true 
) 
public class AndroidModule { 

    @Inject MittoApplication application; 

    @Provides @Singleton 
    SharedPreferences provideSharedPreferences() { 
     return PreferenceManager.getDefaultSharedPreferences(application); 
    } 

} 

ApplicationModule.java

@Module(
     includes = { ApiModule.class, AndroidModule.class }, 
     library = true 
) 
public class ApplicationModule { 

    private Application application; 
    public ApplicationModule(Application application) { 
     this.application = application; 
    } 

    @Provides @Singleton 
    Application providesApplication() { 
     return application; 
    } 
} 

BaseActivity.java

public class BaseActivity extends AppCompatActivity { 

    private ObjectGraph objectGraph; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     objectGraph = MittoApplication.getApplication(this).buildScopedObjectGraph(getModules()); 
     objectGraph.inject(this); 
    } 

    @Override 
    protected void onDestroy() { 
     objectGraph = null; 
     super.onDestroy(); 
    } 

    protected List<Object> getModules() { 
     return Arrays.<Object>asList(
     ); 
    } 
} 

MittoApplication.java

public class MittoApplication extends Application { 

    private static Context context; 
    private ObjectGraph objectGraph; 

    public void onCreate() { 
     super.onCreate(); 
     MittoApplication.context = getApplicationContext(); 
     initializeObjectGraph(); 
    } 

    public static MittoApplication getApplication(Context context) { 
     MittoApplication mittoApplication = (MittoApplication) context.getApplicationContext(); 
     return mittoApplication; 
    } 

    public ObjectGraph getObjectGraph() { 
     return this.objectGraph; 
    } 

    public ObjectGraph buildObjectGraph(List<Object> modules) { 
     return ObjectGraph.create(modules.toArray()); 
    } 

    public ObjectGraph buildScopedObjectGraph(List<Object> modules) { 
     return objectGraph.plus(modules.toArray()); 
    } 

    private ObjectGraph buildInitialObjectGraph(List<Object> modules) { 
     return ObjectGraph.create(modules.toArray()); 
    } 

    private void initializeObjectGraph() { 
     objectGraph = buildInitialObjectGraph(Arrays.<Object>asList(new ApplicationModule(this))); 
    } 

    public static Context getContext() { 
     return MittoApplication.context; 
    } 

} 

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

Спасибо за чтение.

ответ

2

Впрыск впрыска работает только с прямым вызовом графа объекта. Чтобы получить экземпляр application для вашего метода поставщика, вам необходимо указать его как параметр метода поставщика.

//@Inject MittoApplication application; //this won't work 

@Provides @Singleton 
SharedPreferences provideSharedPreferences(Application application) { //this will 
    return PreferenceManager.getDefaultSharedPreferences(application); 
} 

Кроме того, вы никогда не предоставил MittoApplication, только Application.

И стоит отметить, что вы используете Dagger1, поэтому я считаю, что вам нужно будет изменить AndroidModule быть complete=false:

@Module(
     library = true, 
     complete = false 
) 
public class AndroidModule {