2016-03-28 78 views
2

已被封锁数天。注入匕首返回null

出于某种原因,我的AndroidModule.java中的'application'成员字段在注入后为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,所以我相信你将需要改变你的AndroidModulecomplete=false

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