Внедрение Android из BaseActivity во все классы, расширенные из BaseActivity. - PullRequest
0 голосов
/ 15 апреля 2019

В моем приложении я использую Dagger, и некоторые действия используют это, и я хочу реализовать эту инъекцию на BaseActivity вместо внедрения инъекции на все действия, которые я хочу использовать Dagger, например:

это мой LoginActivity:

class LoginActivity : AppCompatActivity(){
    @Inject
    internal lateinit var personsRemoteRepository: PersonsRemoteRepository

    @Inject
    internal var restClient: RestClient? = null

    private var component: ApplicationComponent? = null
    private var mBinding: LoginActivityBinding? = null
    private var viewModel: LoginMethodsViewModel? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        component = DaggerApplicationComponent.builder()
                .projectApplicationComponent(CoreApplication.getComponent())
                .build()
        component?.inject(this)

        mBinding = DataBindingUtil.setContentView(this, R.layout.login_activity)

        personsRemoteRepository = PersonsRemoteRepository(restClient)
        viewModel = LoginMethodsViewModel(personsRemoteRepository, this, mBinding)
        mBinding!!.viewModel = viewModel
    }
}

в этом упражнении я использую DaggerApplicationComponent для инъекции, теперь я хочу иметь BaseActivity, такой как этот класс:

open class BaseActivity : AppCompatActivity() {
    protected var component: ApplicationComponent? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        component = DaggerApplicationComponent.builder()
                .projectApplicationComponent(CoreApplication.getComponent())
                .build()
        component?.inject(this)
    }
}

и когда я расширяю этот класс вместо AppCompatActivity на LoginActivity, я могу использовать инъекцию, например:

class LoginActivity : BaseActivity (){
    @Inject
    internal lateinit var personsRemoteRepository: PersonsRemoteRepository

    @Inject
    internal var restClient: RestClient? = null

    private var component: ApplicationComponent? = null
    private var mBinding: LoginActivityBinding? = null
    private var viewModel: LoginMethodsViewModel? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = DataBindingUtil.setContentView(this, R.layout.login_activity)

        personsRemoteRepository = PersonsRemoteRepository(restClient)
        viewModel = LoginMethodsViewModel(personsRemoteRepository, this, mBinding)
        mBinding!!.viewModel = viewModel
    }
}

1 Ответ

1 голос
/ 15 апреля 2019

Эта функциональность не поддерживается в dagger-java. Но если вы используете dagger-android с ним и у вас есть степень активности с DaggerActivity, он будет работать так, как вы этого хотите. Есть несколько других вещей, которые должны быть добавлены с ним. Как рефакторинг класса приложения, чтобы расширить его с помощью DaggerApplication и добавить рефакторинг ApplicationComponent в вашем случае. Пожалуйста, просмотрите документацию по dagger-android или просто прочитайте статью, которую я написал об этом.

https://medium.com/@ninad458/exploring-android-dagger-9c325c6acfe3

Достаточно просто пройти предварительные условия.

...