gpt4 book ai didi

android - 如何使用 dagger.android @Inject 抽象 BaseActivity 及其子类?

转载 作者:行者123 更新时间:2023-11-29 19:02:23 24 4
gpt4 key购买 nike

我正在使用来自 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,但没有成功。

  • providesMyPreferenceDataStoreApplicationModule 移动到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com