2016-03-28 25 views
2

Birkaç gün boyunca bunu engelledim.Inject in Dagger döndürür null

Herhangi bir nedenle, AndroidModule.java'daki 'application' üye alanım enjeksiyondan sonra sıfırdır.

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; 
    } 

} 

Yaşlarımın üzerinde durduğum için sayısız örnek ve blog sitesine baktım. Birisini daha akıllı bir şekilde sevirim o zaman yardımcı olurum.

Okumak için teşekkürler.

cevap

2

Alan enjeksiyonu, yalnızca nesne grafiğinin doğrudan çağrılmasıyla çalışır. Sağlayıcı yönteminiz için application örneğini edinmek için, sağlayıcı yönteminin bir parametresi olarak başvurmanız gerekir.

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

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

Ayrıca, aslında bir MittoApplication, sadece bir Application sağladı olmadı.

Ve bu Dagger1 kullandığınız fazlalaştı, bu yüzden olmak için AndroidModule değiştirmeniz gerekecektir inanıyoruz complete=false:

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