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()
}
}
我一直对刀柄注入有疑问,因为我对 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()
}
}