Экземпляр SharedPreferences внутри NetworkModule - PullRequest
1 голос
/ 10 июля 2019

Я столкнулся с проблемой SharedPreferences.Я хотел бы знать, как я могу вызвать SharedPreferences внутри Retrofit.Я имею в виду, у меня есть следующий файл:

@Module
class NetworkModule {

@Provides
internal fun provideGson(): Gson {
    return GsonBuilder().create()
}

@Provides
internal fun provideOkHttpClient(): OkHttpClient {
    return OkHttpClient.Builder().addInterceptor { chain ->
        val original = chain.request()
        val requestBuilder = original.newBuilder().addHeader("Accept", "application/json")
        val request = requestBuilder.method(original.method(), original.body()).build()
        chain.proceed(request)
    }.build()
}

@Provides
internal fun provideRetrofit(gson: Gson, okHttpClient: OkHttpClient): Retrofit {
    return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .build()
}
}

И в моем Presenter у меня есть следующий код:

override fun getSavedToken() {
    mToken = mSharedPreferences.getString(TOKEN, TOKEN_UNAVAILABLE)
}

... 

inner class GetAccessTokenSubscriber : ResourceObserver<AccessTokenBean>() {

    override fun onNext(@NonNull accessToken: AccessTokenBean) {
        mSharedPreferences.edit().putString(TOKEN, accessToken.token).apply()
        getInformation()
    }

    override fun onError(@NonNull e: Throwable) {
        mView?.displayError()
    }

    override fun onComplete() {
        // Nothing to do
    }
}

В настоящее время, чтобы установить токен, я поставил токен Bearer $в моем репозитории / сервисе

// Repository
val newToken = "Bearer $token"
    return mService.getInfos(newToken)

// Service
fun getInfos(@Header("Authorization") token: String

Я хотел бы знать, как я могу поместить токен Bearer + в мой файл NetworkModule?

Спасибо за ваше время.

1 Ответ

2 голосов
/ 10 июля 2019

Если вы хотите поместить значение на перехватчик, просто вызовите свой экземпляр SharedPreferences у поставщика перехватчика:

@Provides
internal fun provideOkHttpClient(sharedPrefs: SharedPrefs): OkHttpClient {
    return OkHttpClient.Builder().addInterceptor { chain ->
        val original = chain.request()
        val requestBuilder = original.newBuilder().addHeader("Accept", "application/json")
        val request = requestBuilder.method(original.method(), original.body()).build()
        chain.proceed(request)
    }.build()
}

Теперь кинжал будет искать это, но не найдет его,давая вам ошибку.В этом случае, если ваш сетевой модуль также является синглтоном, просто добавьте includes = [PreferencesModule::class], в противном случае вам может потребоваться установить текущий компонент в зависимости от синглтона, в котором расположен модуль ваших предпочтений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...