Непонятная ошибка с Dagger 2 в Android

Я пытался настроить внедрение зависимостей, но есть кое-что, с чем я не могу справиться. Я почти понимаю, что Dagger ожидает некоторых странных проблем, подобных этой.

Вот ошибка журнала:

 e: /Users/costular/AndroidProjects/TransmissionRemote/app/build/tmp/kapt3/stubs/debug/com/costular/transmissionremote/di/components/ServerComponent.java:8: error: com.costular.transmissionremote.torrents.TorrentRepository cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
e: 

e:     public abstract void inject(@org.jetbrains.annotations.NotNull()
e:                          ^
e:       com.costular.transmissionremote.torrents.TorrentRepository is injected at
e:           com.costular.transmissionremote.torrents.torrent_list.TorrentsActivity.torrentRepository
e:       com.costular.transmissionremote.torrents.torrent_list.TorrentsActivity is injected at
e:           com.costular.transmissionremote.di.components.ServerComponent.inject(activity)
e: /Users/costular/AndroidProjects/TransmissionRemote/app/build/tmp/kapt3/stubs/debug/com/costular/transmissionremote/di/components/TorrentComponent.java:4: error: This @Singleton component cannot depend on scoped components:
e: 

e: @dagger.Component(modules = {com.costular.transmissionremote.di.modules.NetworkModule.class, com.costular.transmissionremote.di.modules.StorageModule.class, com.costular.transmissionremote.di.modules.TorrentModule.class}, dependencies = {com.costular.transmissionremote.di.components.ApplicationComponent.class})
e: ^
e:       @Singleton com.costular.transmissionremote.di.components.ApplicationComponent

Вот код: ApplicationComponent.kt

    @Singleton
@Component(modules = arrayOf(ApplicationModule::class))
interface ApplicationComponent {

    fun inject(myApp: MyApp)

    fun context(): Context

    fun app(): MyApp
}

ApplicationModule.kt

    @Module
class ApplicationModule(private val myApp: MyApp) {

    @Provides
    @Singleton
    fun provideApplication(): MyApp = myApp

    @Provides
    @Singleton
    fun providesContext(): Context = myApp.applicationContext

}

TorrentComponent.kt

 @Singleton
@Component(
        modules = arrayOf(NetworkModule::class, StorageModule::class, TorrentModule::class),
        dependencies = arrayOf(ApplicationComponent::class)
)
interface TorrentComponent {

    fun inject(torrentsActivity: TorrentsActivity)

}

TorrentModule.kt

    @Module
class TorrentModule {

    @Singleton


     @Provides
        fun provideTorrentRepository(client: TransmissionClient): TorrentRepository = TorrentRepository(client)

    }

NetworkModuke.kt

@Module
class NetworkModule(val host: String){

    @Provides
    @Singleton
    fun providesRPCClient(): TransmissionClient = TransmissionClient.getInstance(host)


}

TorrentsActivity.kt

 class TorrentsActivity : AppCompatActivity() {

    @Inject
    lateinit var torrentRepository: TorrentRepository

    lateinit var presenter: TorrentsPresenter

    private val fab by lazy { findViewById(R.id.fab) as FloatingActionButton }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar = findViewById(R.id.toolbar) as Toolbar
        setSupportActionBar(toolbar)

        // Fab listener
        fab.setOnClickListener { presenter.addTorrent() }

        // Fragment initialization
        // Injection
        DaggerTorrentComponent.builder()
                .applicationComponent((application as MyApp).applicationComponent)
                .build()
}

Большое спасибо!


person Costular    schedule 19.08.2017    source источник
comment
Ваша ошибка находится в ServerComponent, где ошибка указывает, что у вас также есть inject(TorrentsActivity). Я предполагаю, что это артефакт, который вы не удалили во время рефакторинга?   -  person David Medenjak    schedule 19.08.2017
comment
Я проверил вашу ссылку, но я думаю, что это другое. Я удалил компонент и каждый вызов, и после этого приложение отлично скомпилировалось. Однако после очистки я снова добавил, и он все еще не работает. У меня есть метод @provide. Я вообще не понимаю ошибки.   -  person Costular    schedule 19.08.2017
comment
Решено! Это была проблема со смешанными прицелами. Все равно спасибо Давид!   -  person Costular    schedule 19.08.2017