远程中的 MVVM 共享首选项 class

MVVM shared prefs in a remote class

因此,我正在按照官方 Android 文档架构(下方)和其他互联网资源,使用 MVVM 模式实施我的第一个 Android 项目。

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

有什么关于如何实现的建议吗?

P.S。我正在使用 Java...

您可以拥有一个接口 PreferenceStorage 并将其注入您的 RemoteDataSource。您可以使用模拟首选项存储来测试您的远程数据源。

这是来自 Google I\O 应用程序的示例:

https://github.com/google/iosched/blob/master/shared/src/main/java/com/google/samples/apps/iosched/shared/data/prefs/PreferenceStorage.kt

在科特林中

class RemoteDataSource @Inject constructor(private val preferenceStorage: PreferenceStorage) {
    ...
}

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

To retrieve an instance of SharedPreferences that the preference hierarchy in this fragment will use by default, call PreferenceManager.getDefaultSharedPreferences(android.content.Context) with a context in the same package as this fragment.

我不认为这是指文件所在的确切包,而是源文件的整体顶级包。因为我能够从我的 PreferenceFragmentCompat 所在的包中分离出我的 fragments/activities 并能够检索存储的设置。

我不建议将 fragment/activity 上下文传递给您的远程数据源 class,但是如果您设置了 Dagger,则可以注入一个 PreferenceManager class 创建的实例通过构造函数获取应用程序上下文并获取您需要的任何设置。或者,您可以从视图 -> 虚拟机 -> repository/data 源传递数据源所需的那些设置。

使用带存储库模式的 MVVM(您的数据源 class)我会执行如下操作:

1.) 创建一个包含数据实例的 ViewModel source/repository class.

2.) 从您的视图 (activity/fragment) 获取 PreferenceManager 的实例并获取您需要的设置。

3.) 将它们传递给您的 viewModel,然后将其传递给您的数据 source/repository.

4.) 使用这些设置

在数据源中执行您需要的任何操作 class
... 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)
}