gpt4 book ai didi

android - Dagger.android 用户范围

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:37 27 4
gpt4 key购买 nike

我正在尝试使用 https://google.github.io/dagger/android 创建 UserScope我有 @Singleton@ActivityScope@FragmentScope@UserScope

应用组件

@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
}
}

用户组件:

@UserScope
@Subcomponent(
modules = [UserModule::class]
)
interface UserComponent {

@Subcomponent.Builder
interface Builder {
@BindsInstance
fun user(user: User): Builder

fun build(): UserComponent
}
}

用户模块:

@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 注入(inject)构造函数参数的问题

@UserScope
class SomeManager @Inject constructor(
private val apiService: ApiService,
private val user: User
) {}

Error message: Error:[dagger.android.AndroidInjector.inject(T)] domain.model.authorize.User cannot be provided without an @Inject constructor or from an @Provides-annotated method.

di.modules.MainActivityBindingModule_ContributeUserFragment.UserFragmentSubcomponent scoped with @di.scopes.FragmentScope may not reference bindings with different scopes: @di.scopes.UserScope class domain.managers.SomeManager

我想创建@UserScope来管理相关的ApiManagers生命周期

更新

@Module
class UserFragmentModule {

@Provides
@FragmentScope
fun provideViewModelFactory(someModule: SomeModule) = UserFragmentViewModelFactory(someModule)
}

贡献AndroidInjector逻辑:

@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
}

最佳答案

您正在尝试注入(inject)仅在 @FragmentScope 中的 @UserScope 中提供的 User 实例。

基本上,规则是每当您需要注入(inject) User - 您需要在 @UserScope 中。

您需要在所有类似的地方将您的 @FragmentScope 注释更改为 @UserScope

根据您发布的内容,我相信它在这里:

@Module
class UserFragmentModule {

@Provides
@UserScope
fun provideViewModelFactory(someModule: SomeModule) = UserFragmentViewModelFactory(someModule)
}

并且您需要将 UserFragmentModule 移动到 UserComponent:

@UserScope
@Subcomponent(
modules = [UserModule::class, UserFragmentModule::class]
)
interface UserComponent {

而且您还需要将 application.userComponent 注入(inject)到您的 UserFragment

这是一个很好的article about subcomponents .我建议您阅读它以获得完整的理解。

另一种选择,我不确定这个,但也许你可以用你的 application.userComponent 注入(inject)你的 UserFragment。

关于android - Dagger.android 用户范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com