如何在Android Java中使用Dagger2向ViewModel注入SharedPreferences

时间:2020-09-03 13:32:59

标签: android dependency-injection sharedpreferences viewmodel dagger-2

在尝试将SharedPreference注入到ViewModel时遇到问题,我正在使用匕首进行依赖项注入。我将在下面的代码中添加主要部分

Module SharedPreferencesModule.java

@Module
public class SharedPreferencesModule {

    private Context context;
    public SharedPreferencesModule(Context context) {
        this.context = context;
    }

    @Provides
    public SharedPreferences provideSharedPreferences() {
        return this.context.getSharedPreferences("login",Context.MODE_PRIVATE);
    }

}

添加了以下子组件

@DashScope
@ContributesAndroidInjector(
        modules = {
        DashboardFragmentBuildersModule.class, D
        ashboardViewModelsModule.class,
        DashboardModule.class,
        SharedPreferencesModule.class // Added Newly for injecting
        }
)
abstract DashboardActivity contibuteDashboardActivity();

我得到的错误在下面给出

错误:@ Subcomponent.Factory方法缺少所需模块或子组件的参数:

我了解到SharedPreferencesModule中的构造函数正在警告该错误,并且由于使用ContributesAndroidInjector添加了该模块,因此我无法将上下文传递给SharedPreferencesModule。但是我需要得到SharedPreferences

有什么办法可以消除这个问题。

我的BaseApplication代码在下面给出

public class BaseApplication extends DaggerApplication {

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent
                .builder()
                .application(this)
                .build();
    }
}

开发的参考资料来自此链接Youtube Link

任何帮助将不胜感激,因为我已经花了一整天了。

注意:我可以使用任何其他解决方案,但不能破坏此项目结构

1 个答案:

答案 0 :(得分:2)

Dagger图中已经有两个上下文:ApplicationDashboardActivity。要使用其中之一,只需将其作为依赖项添加到您的@Provides方法中。 (如果您使用DashboardActivity,建议您先使用@Binds方法将其绑定到ActivityContext。)

例如,要使用图形中已经存在的Application绑定:

@Module
public class SharedPreferencesModule {

    @Provides
    public static SharedPreferences provideSharedPreferences(Application application) {
        return application.getSharedPreferences("login",Context.MODE_PRIVATE);
    }

}