如何在PreferenceFragmentCompat中使用Dagger2实现依赖注入?
嘿,这个问题我之前做项目的时候也碰到过,其实核心就是手动触发Dagger的注入流程就行,毕竟Dagger官方没给PreferenceFragmentCompat的专属封装,咱们自己动手就能搞定。下面是一步步的具体操作:
1. 先确认你的Application已经配置好Dagger基础环境
首先得保证你的App类已经正确集成了Dagger Android的核心能力,要么继承DaggerApplication,要么自己实现HasAndroidInjector接口。
方式一:继承DaggerApplication
class MyApplication : DaggerApplication() { override fun applicationInjector(): AndroidInjector<out DaggerApplication> { return DaggerAppComponent.factory().create(this) } }
方式二:手动实现HasAndroidInjector
如果不想继承DaggerApplication,也可以自己实现接口:
class MyApplication : Application(), HasAndroidInjector { @Inject lateinit var dispatchingInjector: DispatchingAndroidInjector<Any> override fun onCreate() { super.onCreate() DaggerAppComponent.create().inject(this) } override fun androidInjector(): AndroidInjector<Any> { return dispatchingInjector } }
2. 为你的设置Fragment创建注入用的Module和Subcomponent
你需要给SettingsFragment(也就是你的PreferenceFragmentCompat子类)创建一个专属的Module,让Dagger知道该怎么注入它。
创建Fragment的Module
@Module abstract class SettingsFragmentModule { @ContributesAndroidInjector abstract fun provideSettingsFragmentInjector(): SettingsFragment }
这个@ContributesAndroidInjector注解会自动帮你生成对应的Subcomponent,省去手动写Subcomponent的麻烦。
在AppComponent中关联这个Module
确保你的AppComponent包含了AndroidSupportInjectionModule(Dagger用来支持Support库组件的核心模块)和刚才创建的SettingsFragmentModule:
@Component(modules = [AndroidSupportInjectionModule::class, SettingsFragmentModule::class]) interface AppComponent : AndroidInjector<MyApplication> { @Component.Factory interface Factory { fun create(@BindsInstance app: Application): AppComponent } }
3. 在PreferenceFragmentCompat中手动触发注入
现在只需要在你的Fragment的onCreate方法里调用AndroidInjection.inject(this)就行,建议放在super.onCreate(savedInstanceState)之后:
class SettingsFragment : PreferenceFragmentCompat() { // 声明你需要注入的依赖 @Inject lateinit var myRepository: MyRepository override fun onCreate(savedInstanceState: Bundle?) { // 手动触发Dagger注入 AndroidInjection.inject(this) super.onCreate(savedInstanceState) // 这里就可以正常使用注入的依赖了 myRepository.loadSettings() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.settings_preferences, rootKey) } }
可能踩坑的检查点
如果注入失败,可以排查这几点:
- 确认
SettingsFragment已经通过@ContributesAndroidInjector在Module中声明 - AppComponent一定要包含
AndroidSupportInjectionModule(这个很容易忘) - Application类已经正确初始化Dagger并实现了
HasAndroidInjector
这样就能在PreferenceFragmentCompat里正常使用Dagger2的依赖注入啦!
内容的提问来源于stack exchange,提问作者Abdul Mateen

