Dagger2 Binding проблема - PullRequest
0 голосов
/ 25 мая 2020

У меня есть два модуля: один для поставщиков ViewModelModule, а другой - для уровня приложения, который содержит дооснащение, намерение. Итак, прежде чем перейти к компоненту, я включил ViewModelModule в ApplicationModule следующим образом

@Module(includes = [ViewModelModule::class])
class ApplicationModule {

И интерфейс моего компонента похож на:

@Singleton
@Component(modules = [ApplicationModule::class, ContextModule::class])
interface AppComponent {

    fun inject(activity: LoginActivity)
    fun inject(activity: RegisterActivity)
    fun inject(activity: SplashActivity)

}

ApplicationModule class

@Module(includes = [ViewModelModule::class])
class ApplicationModule {

    @Singleton
    @Named("GotoLogin")
    @Provides
    fun provideSplashIntent(appCompatActivity: AppCompatActivity): Intent {
        return Intent(appCompatActivity, LoginActivity::class.java)
    }

    @Singleton
    @Named("GotoDashboard")
    @Provides
    fun provideLoginIntent(appCompatActivity: AppCompatActivity): Intent {
        return Intent(appCompatActivity, DashboardActivity::class.java)
    }

    @Singleton
    @Named("GotoRegister")
    @Provides
    fun provideRegisterIntent(appCompatActivity: AppCompatActivity): Intent {
        return Intent(appCompatActivity, RegisterActivity::class.java)
    }

    @Singleton
    @Provides
    fun provideTimer(): Timer {
        return Timer()
    }
}

Класс ViewModelModule

@Module
abstract class ViewModelModule {

    @Binds
    abstract fun bindviewmodelFactory(factory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(LoginViewModel::class)
    abstract fun bindLoginViewModel(loginViewModel: LoginViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(RegisterViewModel::class)
    abstract fun bindRegisterViewModel(registerViewModel: RegisterViewModel): ViewModel
}

Сценарий: Предположим, когда я пытаюсь использовать функцию из класса ApplicationModule в LoginActivity, появляется ошибка.

Использование:

class LoginActivity : AppCompatActivity() {

    @Inject
    lateinit var factory: ViewModelProvider.Factory
    lateinit var loginViewModel: LoginViewModel
    lateinit var context: Context
    @Named("GotoRegister")
    @Inject
    lateinit var regiseterIntent: Intent

Но когда я пытаюсь использовать что-либо из класса ApplicationModule, возникает ошибка компиляции

Crony\app\build\tmp\kapt3\stubs\debug\com\app\crony\di\AppComponent.java:8: error: [Dagger/MissingBinding] androidx.appcompat.app.AppCompatActivity cannot be provided without an @Inject constructor or an @Provides-annotated method.
    public abstract interface AppComponent {
                    ^
          androidx.appcompat.app.AppCompatActivity is injected at
              com.app.crony.di.ApplicationModule.provideRegisterIntent(appCompatActivity)
          @javax.inject.Named("GotoRegister") android.content.Intent is injected at
              com.app.crony.LoginActivity.regiseterIntent

Полный исходный код: Ссылка на Github

Я чувствую, что я что-то упустил, но не могу решить проблему.

1 Ответ

1 голос
/ 25 мая 2020

Замените activity на context. Это будет работать хорошо.

...