Jor*_*dez 4 android dependency-injection kotlin dagger-2
我正在使用Dagger 2 中的新dagger.android包在我的项目中注入 Android 依赖项。
BaseActivity在我的BaseActivity我有要注入的成员变量。这边走:
abstract class BaseActivity : AppCompatActivity() {
@Inject
lateinit var prefs: MyPreferenceDataStore
...// more @Injected members
}
Run Code Online (Sandbox Code Playgroud)我这样做是因为我希望的子类BaseActiviy可以访问注入的成员BaseActivity:
class SubClassActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle) {
val x = prefs.getXXX //use prefs variable from parent class
}
}
Run Code Online (Sandbox Code Playgroud)这是我的应用程序组件:
@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)
}
Run Code Online (Sandbox Code Playgroud)该ApplicationModule班有简单@Provides注解的方法:
@Module
class ApplicationModule {
@Singleton @Provides
fun providesMyPreferenceDataStore(context: Context): MyPreferenceDataStore {
return MyPreferenceDataStoreImpl(context)
}
// more @Provides annotated methods
}
Run Code Online (Sandbox Code Playgroud)
我认为问题出在我的 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
}
Run Code Online (Sandbox Code Playgroud)这是我迄今为止尝试过的:
使bindSubClassActivity()方法不依赖于BaseActivityModule::class,不起作用。
将providesMyPreferenceDataStorefrom移动ApplicationModule到BaseActivityModule,使类为:
@Module
class BaseActivityModule {
@PerActivity @Provides
fun providesMyPreferenceDataStore(context: Context): MyPreferenceDataStore {
return MyPreferenceDataStoreImpl(context)
}
}
Run Code Online (Sandbox Code Playgroud)这是我得到的错误:
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.
Run Code Online (Sandbox Code Playgroud)
我不完全理解你试图做什么,但这个解决方案基于我的理解
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
}
}
Run Code Online (Sandbox Code Playgroud)
您的基本活动将注入所有对象
abstract class BaseActivity : DaggerAppCompatActivity() {
@Inject
lateinit var prefs: SharedPreferences
//other objects to inject
}
Run Code Online (Sandbox Code Playgroud)
将从它继承的活动,例如:MainActivity
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
prefs.getBoolean("s", true)
}
}
Run Code Online (Sandbox Code Playgroud)
和活动模块
@Module
abstract class ActivityModule {
@ContributesAndroidInjector
abstract fun bindMainActivity(): MainActivity
@ContributesAndroidInjector
abstract fun bindBaseActivity():BaseActivity
}
Run Code Online (Sandbox Code Playgroud)
应用模块
@Module
class AppModule {
@Singleton
@Provides
fun providesMyPreferenceDataStore(application: Application): SharedPreferences {
return application.getSharedPreferences("test", Context.MODE_PRIVATE)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5164 次 |
| 最近记录: |