[英]Inject in Dagger returns null
被這個問題屏蔽了好幾天。
出於某種原因,我的 AndroidModule.java 中的“應用程序”成員字段在注入后為空。
安卓模塊.java
@Module(
library = true
)
public class AndroidModule {
@Inject MittoApplication application;
@Provides @Singleton
SharedPreferences provideSharedPreferences() {
return PreferenceManager.getDefaultSharedPreferences( application );
}
}
應用程序模塊
@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;
}
}
基本活動.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;
}
}
我花了很長時間思考這個問題,我看過無數的例子和博客網站。 會喜歡比我更聰明的人來幫忙。
謝謝閱讀。
字段注入僅適用於對象圖的直接調用。 要獲取提供程序方法的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 {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.