首页 > 解决方案 > Android Hilt通过共享首选项传递基本网址第二次不起作用

问题描述

在我的应用程序中有一个配置屏幕,用户在其中输入基本 url,然后它将在 app 中使用。我将用户输入的 url 保存在共享首选项中。在我的 Hilt 应用模块类中,我使用像这样的提供从共享首选项传递该 url

@Provides
fun providesBaseUrl(application: Application):String{
    return PrefManager.getInstance(application).getString(PreferenceConstants.SERVER_URL)+API_NAME+API_VERSION
}

@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient,BASE_URL:String): Retrofit {
    return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
            .build()
}

如果我在将配置保存在应用程序中后直接登录,这个东西就可以正常工作。但是,如果我注销并关闭应用程序,那么当我重新打开它时,它会不断崩溃,因为它找不到 Base Url 的值。

这是崩溃日志

Process: com.uneecops.plussuite, PID: 15331
java.lang.IllegalArgumentException: Expected URL scheme 'http' or 'https' but no colon was found
    at okhttp3.HttpUrl$Builder.parse$okhttp(HttpUrl.kt:1261)
    at okhttp3.HttpUrl$Companion.get(HttpUrl.kt:1634)
    at okhttp3.HttpUrl.get(Unknown Source:2)
    at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:492)
    at com.uneecops.plussuite.AppModule.provideRetrofit(AppModule.kt:40)
    at com.uneecops.plussuite.AppModule_ProvideRetrofitFactory.provideRetrofit(AppModule_ProvideRetrofitFactory.java:44)
    at com.uneecops.plussuite.base.DaggerBaseApplication_HiltComponents_ApplicationC.getRetrofit(DaggerBaseApplication_HiltComponents_ApplicationC.java:193)
    at com.uneecops.plussuite.base.DaggerBaseApplication_HiltComponents_ApplicationC.getApiEndpoints(DaggerBaseApplication_HiltComponents_ApplicationC.java:202)
    at com.uneecops.plussuite.base.DaggerBaseApplication_HiltComponents_ApplicationC.access$800(DaggerBaseApplication_HiltComponents_ApplicationC.java:123)
    at com.uneecops.plussuite.base.DaggerBaseApplication_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl.getLoginRepo(DaggerBaseApplication_HiltComponents_ApplicationC.java:479)
    at com.uneecops.plussuite.base.DaggerBaseApplication_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl.access$2900(DaggerBaseApplication_HiltComponents_ApplicationC.java:279)
    at com.uneecops.plussuite.base.DaggerBaseApplication_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl$SwitchingProvider.get(DaggerBaseApplication_HiltComponents_ApplicationC.java:1024)
    at com.uneecops.plussuite.ui.login.LoginViewModel_AssistedFactory.create(LoginViewModel_AssistedFactory.java:27)
    at com.uneecops.plussuite.ui.login.LoginViewModel_AssistedFactory.create(LoginViewModel_AssistedFactory.java:12)
    at androidx.hilt.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:76)
    at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)
    at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)
    at com.uneecops.plussuite.ui.login.LoginFragment.getViewModel(Unknown Source:2)
    at com.uneecops.plussuite.ui.login.LoginFragment.getViewModel(LoginFragment.kt:25)
    at com.uneecops.plussuite.base.BaseFragment.onCreate(BaseFragment.kt:55)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2685)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280)
    at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
    at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255)
    at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138)
    at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2001)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1959)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1861)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2641)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2589)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
    at android.app.Activity.performStart(Activity.java:7157)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2937)

我没有在注销时从共享首选项中清除值,但仍然会发生此错误。

标签: androidkotlindagger-hilt

解决方案


推荐阅读