Android SharedPreference 的刀柄注入

Android hilt injection for SharedPreference

我一直对刀柄注入有疑问,因为我对 DI 的概念比较陌生, 这是我有一个 class 管理我的应用程序会话(共享首选项)的问题,我想将 class 注入我的用例(Activity/Fragment),现在当我这样做时抛出这个错误

"lateinit 属性 sessionManager 尚未初始化"

SessionManager.kt

代码
class SessionManager @Inject constructor(private val preferences: SharedPreferences) {

    fun getTheme() = preferences.getInt(Constants.THEME_KEY, AppCompatDelegate.MODE_NIGHT_NO)

    fun setTheme(value: Int) {
        val editor = preferences.edit()
        editor.putInt(Constants.THEME_KEY, value)
        editor.apply()
    }
}

代码 appmoudle.kt

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Singleton
    @Provides
    fun provideSharedPreferences(@ApplicationContext context: Context) =
        context.getSharedPreferences(
            Constants.PREF_NAME, Context.MODE_PRIVATE
        )

    @Singleton
    @Provides
    fun provideSessionManager(preferences: SharedPreferences) =
        SessionManager(preferences)
}

activity 的代码,我将其注入

@AndroidEntryPoint
class TrendingRepoActivity : BaseActivity(), View.OnClickListener {

    private lateinit var viewModel: TrendingRepoViewModel
    private lateinit var binding: ActivityTrendingReposBinding

    @Inject
    lateinit var sessionManager: SessionManager

    override fun onCreate(savedInstanceState: Bundle?) {
        AppCompatDelegate.setDefaultNightMode(sessionManager.getTheme())
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_trending_repos)

        setSupportActionBar(binding.appBarLayout.toolbar)
        binding.errorView.retryBtn.setOnClickListener(this)

        init()
    }
}

好的,所以在挖掘出来之后,这不是刀柄问题,而是我犯的一个小错误

问题出在 activity 中,我在 super.oncreate 之前调用注入的 class 下面是修复方法

@AndroidEntryPoint
class TrendingRepoActivity : BaseActivity(), View.OnClickListener {
private lateinit var viewModel: TrendingRepoViewModel
private lateinit var binding: ActivityTrendingReposBinding

@Inject
lateinit var sessionManager: SessionManager

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    AppCompatDelegate.setDefaultNightMode(sessionManager.getTheme())
    binding = DataBindingUtil.setContentView(this, 
    R.layout.activity_trending_repos)

    setSupportActionBar(binding.appBarLayout.toolbar)
    binding.errorView.retryBtn.setOnClickListener(this)

        init()
    }
}