Android Dagger 2 Контекст действия внутри другого класса - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблема с 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, несмотря на то, что простой кинжал создает много стандартного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...