@Singleton
、@ActivityScope
、@FragmentScope
和@UserScope
。
AppComponent
@Singleton
@Component(
modules = [
AndroidSupportInjectionModule::class,
ActivityBindingModule::class,
AppModule::class,
ApiModule::class
]
)
interface AppComponent {
fun inject(application: Application)
fun createUserComponent(): UserComponent.Builder
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
fun apiModule(module: ApiModule): Builder
fun build(): AppComponent
}
}
UserComponent:
@UserScope
@Subcomponent(
modules = [UserModule::class]
)
interface UserComponent {
@Subcomponent.Builder
interface Builder {
@BindsInstance
fun user(user: User): Builder
fun build(): UserComponent
}
}
UserModule:
@Module
class UserModule {
@UserScope
@Provides
fun provideUser(user: User): User = user
}
以下是我在成功登录后创建UserComponent
的方法:
private fun createSession(user: User) {
userComponent = appComponent.createUserComponent().user(user).build()
}
我还有一个UserManager,它会触发与User
注入构造函数参数相关的问题。
@UserScope
class SomeManager @Inject constructor(
private val apiService: ApiService,
private val user: User
) {}
错误信息:Error:[dagger.android.AndroidInjector.inject(T)] 未使用@Inject构造函数或@Provides注释方法提供domain.model.authorize.User。 di.modules.MainActivityBindingModule_ContributeUserFragment.UserFragmentSubcomponent范围为@di.scopes.FragmentScope,不得引用具有不同作用域的绑定:@di.scopes.UserScope类domain.managers.SomeManager。
我想创建@UserScope来管理相关的ApiManagers生命周期。
@Module
class UserFragmentModule {
@Provides
@FragmentScope
fun provideViewModelFactory(someModule: SomeModule) = UserFragmentViewModelFactory(someModule)
}
ContributesAndroidInjector逻辑:
@Module
interface ActivityBindingModule {
@ActivityScope
@ContributesAndroidInjector(modules = [SplashModule::class])
fun contributeSplashActivity(): SplashActivity
@ActivityScope
@ContributesAndroidInjector(modules = [SignInModule::class])
fun contributeAuthorizeActivity(): Activity
@ActivityScope
@ContributesAndroidInjector(modules = [MainModule::class])
fun contributeMainActivity(): MainActivity
}
@Module(includes = [MainActivityBindingModule::class])
class MainModule
@Module
interface MainActivityBindingModule {
@FragmentScope
@ContributesAndroidInjector(modules = [UserFragmentModule::class])
fun contributeUserFragment(): UserFragment
}
UserFragmentSubcomponent
? - azizbekianUserModule
吗?它应该有一个依赖项SomeManager
,并且作用域为@UserScope
。但是,只要UserFragmentSubcomponent
的作用域为@FragmentScope
,这是不可能的。其次,也不存在一个提供User
对象的方法。 - azizbekianUserFragmentModule
,它位于@FragmentScope
下,但使用SomeManager
作为依赖项。我尝试将UserFragment
作为UserComponent
的子组件,但在Application
类中注入DispatchingAndroidInjector
时出现问题,因为我需要同时拥有@Singleton
和@UserScope
的注入器。 - Near1999