我正在使用来自 Dagger 2 的新 dagger.android
包在我的项目中注入(inject) Android 依赖项。
- 我需要我所有的 Activity 都是抽象
BaseActivity
的子类
在我的
BaseActivity
中,我有要注入(inject)的成员变量。这样:abstract class BaseActivity : AppCompatActivity() { @Inject lateinit var prefs: MyPreferenceDataStore ...// more @Injected members }
我这样做是因为我希望
BaseActiviy
的子类可以访问BaseActivity
的注入(inject)成员:class SubClassActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle) { val x = prefs.getXXX //use prefs variable from parent class } }
这是我的应用程序组件:
@Singleton @Component(modules = arrayOf( ApplicationModule::class, ActivityBindingModule::class, AndroidSupportInjectionModule::class )) interface ApplicationComponent { @Component.Builder interface Builder { @BindsInstance fun application(application: Application): Builder fun build(): ApplicationComponent } fun inject(app: AndroidApplication) }
ApplicationModule
类具有简单的@Provides
注释方法:@Module class ApplicationModule { @Singleton @Provides fun providesMyPreferenceDataStore(context: Context): MyPreferenceDataStore { return MyPreferenceDataStoreImpl(context) } // more @Provides annotated methods }
我认为问题出在我的
ActivityBindingModule
@Module abstract class ActivityBindingModule { @PerActivity @ContributesAndroidInjector( modules = arrayOf(BaseActivityModule::class )) abstract fun bindBaseActivity(): BaseActivity @PerActivity @ContributesAndroidInjector( modules = arrayOf( BaseActivityModule::class )) abstract fun bindSubClassActivity(): SubClassActivity }
这是我目前尝试过的:
使
bindSubClassActivity()
方法不依赖于BaseActivityModule::class
,但没有成功。将
providesMyPreferenceDataStore
从ApplicationModule
移动到BaseActivityModule
,这样类就是:@Module class BaseActivityModule { @PerActivity @Provides fun providesMyPreferenceDataStore(context: Context): MyPreferenceDataStore { return MyPreferenceDataStoreImpl(context) } }
这是我遇到的错误:
Error: [dagger.android.AndroidInjector.inject(T)] com.example.BaseActivity cannot
be provided without an @Provides-annotated method.
This type supports members injection but cannot
be implicitly provided.
最佳答案
我不明白你到底想做什么,但这个解决方案基于我的理解
AppComponent 应该是这样的
@Singleton
@Component(modules = [
AndroidSupportInjectionModule::class,
AppModule::class,
ActivityModule::class])
interface AppComponent : AndroidInjector<DaggerApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
将注入(inject)所有对象的基础 Activity
abstract class BaseActivity : DaggerAppCompatActivity() {
@Inject
lateinit var prefs: SharedPreferences
//other objects to inject
}
将从它继承的 Activity eg:MainActivity
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
prefs.getBoolean("s", true)
}
}
和 Activity 模块
@Module
abstract class ActivityModule {
@ContributesAndroidInjector
abstract fun bindMainActivity(): MainActivity
@ContributesAndroidInjector
abstract fun bindBaseActivity():BaseActivity
}
应用模块
@Module
class AppModule {
@Singleton
@Provides
fun providesMyPreferenceDataStore(application: Application): SharedPreferences {
return application.getSharedPreferences("test", Context.MODE_PRIVATE)
}
}
关于android - 如何使用 dagger.android @Inject 抽象 BaseActivity 及其子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48522773/