Я сейчас изучаю Dagger2. Я учусь, глядя на несколько примеров. Но есть некоторые части, которые не работают должным образом, глядя на примеры. Я знаю, что структура Dagger2 должна быть определена и реализована в порядке приложения -> активный -> пользовательский компонент. Тем не менее, произошла ошибка при этом. сообщение java.lang.RuntimeException: android.app.Application does not implement dagger.android.HasActivityInjector
Код длинный, но я sh кто-нибудь появится, чтобы помочь мне. Я очень отчаялся.
AppComponent
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class,
ActivityBindingModule::class,
ApplicationModule::class])
interface AppComponent : AndroidInjector<BaseApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
BaseApplication
class BaseApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().application(this).build()
}
}
ActivityScope
@Scope
annotation class ActivityScope
ActivityBindingModule
@Module
abstract class ActivityBindingModule {
@ContributesAndroidInjector(modules = [MainModule::class])
abstract fun mainActivity(): MainActivity
}
MainModule
@Module
class MainModule {
@ActivityScope
@Provides
fun util() : Utils = Utils()
}
ApplicationModule
@Module
class ApplicationModule {
@Provides
fun providesContext(application: Application): Context {
return application
}
}
Утилиты
class Utils {
@Inject constructor(){
}
fun add(a :Int, b:Int):Int= a+b
fun sub(a :Int, b:Int):Int= a-b
fun div(a :Int, b:Int):Int= a/b
fun mul(a :Int, b:Int):Int= a*b
}
MainActivity
class MainActivity : DaggerAppCompatActivity(), HasActivityInjector {
lateinit var utils : Utils
@Inject
lateinit var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var aa = utils.add(10,20)
Log.d("TAG",""+aa)
}
override fun activityInjector(): AndroidInjector<Activity> {
return activityDispatchingAndroidInjector
}
}