在没有上下文的情况下获取共享偏好

Get shared preferences without context

大家晚上好!我想使用共享首选项来存储我的令牌(我知道这不安全,我是 android 开发的新手,只想尝试)然后将其传递给拦截器。我如何在那里初始化共享首选项?谢谢!或者你能给我一个如何实现拦截器或存储令牌的提示吗?

抱歉,我已经尝试搜索此主题,无法实现其他开发人员的方法。

object NetworkModule {

    var sharedPreferences = //GET SHARED PREFERENCES THERE

    var authToken: String? = sharedPreferences.getString("Token", null)
    val baseURL = //my base url

    
    val loggingInterceptor = HttpLoggingInterceptor().apply {
        level = HttpLoggingInterceptor.Level.BODY
    }


    var httpClient = OkHttpClient.Builder().addInterceptor { chain ->
        chain.proceed(
            chain.request().newBuilder().also { it.addHeader("Authorization", "Bearer $authToken") }
                .build()
        )
    }.connectTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .addNetworkInterceptor(loggingInterceptor)
        .build()

    val retrofit = Retrofit.Builder().baseUrl(baseURL).addConverterFactory(
        GsonConverterFactory.create()
    ).client(httpClient).build()


    val api: API by lazy { retrofit.create() }
    val apiClient = ApiClient(api)
}

您可以使用 ApplicationContext 从您的应用在任何地方 访问 SharedPreferences 。这是 Android 开发中非常普遍的做法,而且非常安全。

要访问 ApplicationContext 请参阅下面的代码:

  1. 在你的 Application class 中添加一个 Application Singleton.

    class MyApplication : Application() {
         override fun onCreate() {
            super.onCreate()
            instance = this
         }
    
         companion object {
             lateinit var instance: MyApplication
                 private set
         }
    }
    

    (What is an Application Class?)

  2. 在您的应用中的任何地方使用ApplicationContext

    var sharedPreferences = getApplicationContext() //here you go!
    

此代码可以完成工作,但是,如果您对最佳Android 开发实践感兴趣,请阅读此内容:

推荐2个选项

  1. 最佳实践:创建一个新的管理器class负责应用程序的整个SharedPreferences使用(例如SharedPreferenceManager).这个 class 是一个 Singleton Class,它是用 ApplicationContext 实例化的,并且在 SharedPreferences 中具有与 CRUD 操作相关的所有方法,在你的例子中 setTokengetToken。由于经理 class 是独立的,因此不应导致任何 Lifecycle 错误或 NullPointer 错误。

    由于附上示例代码会使我的答案混乱,我决定引用 someone else's code here, this will teach you how to implement it.

  2. 如果您懒得遵循#2:您可以使用已经为您完成此操作的库:Pixplicity/EasyPrefs.

    • Manager一样易于使用Class ✅
    • 没有更多与 SharedPreferences 相关的错误 ✅
    • 您可以随时改造任何现有项目 ✅

如果您有任何问题,请告诉我。谢谢

在实际实现中使用这些:

actual typealias PlatformContext = Activity  //Android

actual typealias PlatformContext = NSObject  //iOS

这是实现此目标并解决了我的问题的好教程: UserDefaults and SharedPreference in KMM