如何在 android java 中使用 Dagger2 将 SharedPreferences 注入 ViewModel

Aji*_*ith 5 android dependency-injection viewmodel sharedpreferences dagger-2

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

模块 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

添加子组件如下所示

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

我收到的错误如下

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

我知道 SharedPreferencesModule 中的构造函数导致了错误,并且由于该模块是使用 ContributesAndroidInjector 添加的,因此我无法将上下文传递给 SharedPreferencesModule。但我需要它来获取 SharedPreferences

有什么办法可以摆脱这个问题吗?

我的 BaseApplication 代码如下

public class BaseApplication extends DaggerApplication {

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

开发参考来自此链接Youtube Link

任何帮助将不胜感激,因为我花了一整天的时间来处理这个问题。

注意:我可以使用任何替代解决方案,但我不能破坏这个项目结构

小智 5

您的 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);
    }

}
Run Code Online (Sandbox Code Playgroud)