Dagger2 绑定问题
Dagger2 Binding issue
我有两个模块,一个用于 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)
}
应用模块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 class
@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
}
场景:
假设当我尝试在 LoginActivity 中使用 ApplicationModule Class 中的函数时,错误就来了。
用法:
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 class 中的任何内容时,出现编译错误
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 Link
我能感觉到我遗漏了什么但无法解决问题。
将 activity
替换为 context
。它会很好用。
我有两个模块,一个用于 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)
}
应用模块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 class
@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
}
场景: 假设当我尝试在 LoginActivity 中使用 ApplicationModule Class 中的函数时,错误就来了。
用法:
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 class 中的任何内容时,出现编译错误
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 Link
我能感觉到我遗漏了什么但无法解决问题。
将 activity
替换为 context
。它会很好用。