gpt4 book ai didi

java - 在 Dagger 中注入(inject)返回 null

转载 作者:可可西里 更新时间:2023-11-01 11:40:39 29 4
gpt4 key购买 nike

被封锁了好几天。

出于某种原因,我在 AndroidModule.java 中的“application”成员字段在注入(inject)后为空。

AndroidModule.java

@Module(
library = true
)
public class AndroidModule {

@Inject MittoApplication application;

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

}

应用模块.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;
}
}

基础 Activity .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;
}

}

我花了很长时间思考这个问题,我看过无数的例子和博客网站。会喜欢比我更聪明的人来帮忙。

感谢阅读。

最佳答案

字段注入(inject)仅适用于直接调用对象图。要为您的提供者方法获取 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 {

关于java - 在 Dagger 中注入(inject)返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260374/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com