У меня проблема с Dagger2. Проблема в том, что у меня есть класс, обеспечивающий навигацию между действиями и фрагментами.
Класс NavigationService , который использует инжекцию конструктора с AppCompatActivity для FragmentMNanager для управления backStack
class NavigationService @Inject constructor(val appCompatActivity: AppCompatActivity) {
У меня есть ActivityComponent , который очень прост, например:
@Component(modules = [BaseActivityModule::class])
interface ActivityComponent {
fun injectActivity(mainActivity: MainActivity)
fun injectSecondActivity(secondActivity: SecondActivity)
fun getPresenterComponent(): PresenterComponent.Factory
}
Класс ActivityModule
@Module(subcomponents = [PresenterComponent::class])
class BaseActivityModule( var appCompatActivity: AppCompatActivity) {
@Provides
fun providdNavigationService(): NavigationService = NavigationService(appCompatActivity)
@Provides
fun provideAppCompatActivity(): AppCompatActivity = appCompatActivity
}
И Компонент Presenter, который является подкомпонентом Activity
@Subcomponent
interface PresenterComponent {
@Subcomponent.Factory
interface Factory {
fun presenterModule( @BindsInstance basePResenter: BasePResenter): PresenterComponent
}
}
BaseActivity , где ActivitiyComponent имеет инициализацию.
open class BaseActivity : AppCompatActivity() {
val activityComponent: ActivityComponent by lazy {
initializeActivityComponent()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
private fun initializeActivityComponent(): ActivityComponent =
DaggerActivityComponent.builder().baseActivityModule(BaseActivityModule((this))).build()
}
И я получил класс BasePresenter , в который я хочу добавить класс NavigationService , например:
class BasePresenter {
@Inject
lateinit var navigationService: NavigationService
}
И вот проблема. Инжекция отлично работает в MainActivity и SecondActivity, но когда я хотел внедрить в BasePresenter, он всегда был нулевым.
kotlin .UninitializedPropertyAccessException: свойство lateinit navigationService не было инициализировано в com.example. daggerlearningproject.util.BasePResenter.getNavigationService (BasePResenter.kt: 12)
Есть идеи, как решить эту проблему? Я знаю, что многие разработчики мобильных приложений работают с кинжалом - android, но я нахожу это немного запутанным. Какой из них лучше dagger- android или простой вариант dagger 2? Кто-то предпочитает реализацию простого кинжала вместо кинжала - android, несмотря на то, что простой кинжал создает много стандартного кода.