我试图创建一个用户范围https://google.github.io/dagger/android我有@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
}
}
Run Code Online (Sandbox Code Playgroud)
UserComponent:
@UserScope
@Subcomponent(
modules = [UserModule::class]
)
interface UserComponent {
@Subcomponent.Builder
interface Builder {
@BindsInstance
fun user(user: User): Builder
fun build(): UserComponent
}
}
Run Code Online (Sandbox Code Playgroud)
UserModule:
@Module
class UserModule {
@UserScope
@Provides
fun provideUser(user: User): User = user
}
Run Code Online (Sandbox Code Playgroud)
以下是我UserComponent成功登录后的创建方式:
private fun createSession(user: User) {
userComponent = appComponent.createUserComponent().user(user).build()
}
Run Code Online (Sandbox Code Playgroud)
而且我有UserManager,它引发User注入构造函数参数的问题
@UserScope
class SomeManager @Inject constructor(
private val apiService: ApiService,
private val user: User
) {}
Run Code Online (Sandbox Code Playgroud)
错误消息:错误:[dagger.android.AndroidInjector.inject(T)] domain.model.authorize.User如果没有@Inject构造函数或@ Provide-annotated方法,则无法提供.
使用@ di.scopes.FragmentScope作为范围的di.modules.MainActivityBindingModule_ContributeUserFragment.UserFragmentSubcomponent可能不会引用具有不同范围的绑定:@ di.scopes.UserScope class domain.managers.SomeManager
我想创建@UserScope以管理相关的ApiManagers生命周期
@Module
class UserFragmentModule {
@Provides
@FragmentScope
fun provideViewModelFactory(someModule: SomeModule) = UserFragmentViewModelFactory(someModule)
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
您正在尝试注入仅在inUser中提供的实例。@UserScope@FragmentScope
基本上,规则是每当您需要User注入时 - 您需要位于@UserScope.
您需要在所有类似的地方更改注释@FragmentScope。@UserScope
从你发布的内容来看,我相信它在这里:
@Module
class UserFragmentModule {
@Provides
@UserScope
fun provideViewModelFactory(someModule: SomeModule) = UserFragmentViewModelFactory(someModule)
}
Run Code Online (Sandbox Code Playgroud)
您需要将您的移动UserFragmentModule到UserComponent:
@UserScope
@Subcomponent(
modules = [UserModule::class, UserFragmentModule::class]
)
interface UserComponent {
Run Code Online (Sandbox Code Playgroud)
你还需要注入application.userComponent到你的UserFragment
这是一篇关于子组件的好文章。我建议您阅读它以获得充分的理解。
另一种选择,我不确定这个,但也许你可以将你的 UserFragment 与你的application.userComponent.
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |