首页 > 解决方案 > 远程类中的 MVVM 共享首选项

问题描述

因此,我通过遵循官方 Android 文档架构(如下)和其他互联网资源,使用 MVVM 模式实现了我的第一个 Android 项目。

MVVM 架构

在另一个活动中,我使用了PreferenceFragmentCompat来保存一些用户设置。现在我需要远程数据源类中的这些设置,但没有上下文我无法访问共享首选项。

关于如何做到这一点的任何建议?

PS我正在使用Java...

标签: javaandroidmvvmsharedpreferencesandroid-viewmodel

解决方案


从他们的文档(https://developer.android.com/reference/androidx/preference/PreferenceFragmentCompat

要检索此片段中的首选项层次结构将默认使用的 SharedPreferences 实例,请使用与此片段相同的包中的上下文调用 PreferenceManager.getDefaultSharedPreferences(android.content.Context)。

我不相信这指的是文件所在的确切包,而是源文件的整体顶级包。因为我能够将我的片段/活动拆分为与我的 PreferenceFragmentCompat 所在的包不同的包,并且能够检索存储的设置。

我不建议将片段/活动上下文传递给您的远程数据源类,但如果您有匕首设置,您可以通过构造函数注入从应用上下文创建的 PreferenceManager 类的实例并获取您需要的任何设置。或者,您可以从视图 -> vm -> 存储库/数据源传递数据源所需的那些设置。

将 MVVM 与存储库模式(您的数据源类)一起使用,我将执行以下操作:

1.) 创建一个 ViewModel,它包含您的数据源/存储库类的实例。

2.) 从您的视图(活动/片段)中,获取 PreferenceManager 的实例并获取您需要的设置。

3.) 将它们传递给您的 viewModel,然后将其传递给您的数据源/存储库。

4.) 使用这些设置在数据源类中做任何你需要的事情

... inside your view class
val pref = PreferenceManager.getDefaultSharedPreferences(context).getString(PREF_KEY_NAME, null)

viewModel.yourMethod(pref)

... inside your viewmodel class
fun yourMethod(pref: String?) {
    repository.doSomething(pref)
}

... inside your repository/data source class
fun doSomething(pref: String?) {
    // whatever you need to do with this pref. 
    // e.g. api call
    api.doMethod(pref)
}

推荐阅读