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

标签 java android dagger

此问题已被屏蔽很多天了。

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

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

}

我花了很长时间思考这个问题,我查看了无数的例子和博客网站。希望有人比我更聪明来提供帮助。

感谢您的阅读。

最佳答案

字段注入(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/

相关文章:

java - 2 最优求解TSP的opt算法

java 8,List<Employee> 映射部门和地址列表

android - 无法加载类的模块适配器。请确保已为此模块运行代码生成

android - 何时调用 Dagger 2 inject in android component lifecycle

java - 多边形无法正确旋转

用于解码 JAXB 对象的 Java 泛型

java - 我无法应用 gradle 6.x 插件

android - 如何通过委托(delegate)使用 mutableState 并使其可传递给另一个函数?

android - 在 2 行 Gridview 之间添加 View

android - 在 Dagger 2 中使用 @Binds 和 @Named