Как внедрить деятельность в другой класс - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно @Inject конструктор activity и fragmentManager в мой Navigator.class. Но я получаю эту ошибку:

AppCompatActivity не может быть предоставлена ​​без конструктора @Inject или от @ Предоставляет аннотированный метод.

Я прочитал все подобные вопросы о Stackoverflow. Я сделал все, что они предложили, но не нашел ответа.

Navigator.class

@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
                                    private val fragmentManager: FragmentManager)

BaseActivity.class

abstract class BaseActivity: AppCompatActivity(), HasSupportFragmentInjector{
    @Inject
    lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
    @Inject
    lateinit var navigator: Navigator
   override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
override fun supportFragmentInjector() = fragmentInjector

BaseModule.class

@Module
abstract class BaseActivityModule {
@Module
companion object {

    @JvmStatic
    @Provides
    @Named(ACTIVITY_FRAGMENT_MANAGER)
    @PerActivity
    fun activityFragmentManager(activity: AppCompatActivity): FragmentManager =
            activity.supportFragmentManager
}

@Binds
@PerActivity
abstract fun activity(appCompatActivity: AppCompatActivity): Activity

@Binds
@PerActivity
abstract fun activityContext(activity: Activity): Context

MainActivityModule.class

@Module(includes = [
    BaseActivityModule::class

])
abstract class MainActivityModule {

    @Binds
    @PerActivity
    abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity

AppModule.class

    @Module(includes = [AndroidSupportInjectionModule::class])
abstract class AppModule {
@Binds
@Singleton
abstract fun application(app: App): Application

@PerActivity
@ContributesAndroidInjector(modules = [MainActivityModule::class])
abstract fun mainActivityInjector(): MainActivity

1 Ответ

0 голосов
/ 29 июня 2018

Сначала убедитесь, что понимает, что означает ошибка . Вы пытаетесь ввести AppCompatActivity, но Кинжал жалуется, что он не может быть предоставлен . Все идет нормально. Пожалуйста, всегда включайте полную ошибку, как показано в ссылке, чтобы нам было легче видеть, что происходит. В вашем случае это похоже на проблему с ограничением объема.

Вы предоставляете Навигатор через инжектор конструктора как @Singleton ...

@Singleton
class Navigator @Inject constructor(private val activity: AppCompatActivity,
                                private val fragmentManager: FragmentManager)

И вы предоставляете / связываете AppCompatActivity из модуля с областью действия @PerActivity.

@Binds
@PerActivity
abstract fun appCompatActivity(mainActivity: MainActivity): AppCompatActivity

Так что, если у вас нет действительно сумасшедших настроек, @Singleton не сможет получить доступ к @PerActivity. Если бы это было возможно, вы бы, по крайней мере, имели бы утечку памяти, так как вы сохранили бы свой экземпляр Activity дольше, чем его время жизни (onCreate -> onDestroy)


Чтобы решить вашу проблему, вам нужно либо переместить Navigator в область действия, чтобы она также была @PerActivity, и поделиться жизненным циклом операций, на которые он ссылается (чтобы он не просочился), либо вы должны удалить зависимость от ваша активность в вашем конструкторе. Если вам действительно нужно, чтобы оно было @Singleton и указывало на действие, вы можете иметь установщик для текущего действия, но, опять же, следите за утечками.

...