Dagger.android UserScope

Nea*_*999 6 android dagger

我试图创建一个用户范围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生命周期

UPD

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

Tpo*_*6oH 0

您正在尝试注入仅在inUser中提供的实例。@UserScope@FragmentScope

基本上,规则是每当您需要User注入时 - 您需要位于@UserScope.

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

从你发布的内容来看,我相信它在这里:

@Module
class UserFragmentModule {

  @Provides
  @UserScope
  fun provideViewModelFactory(someModule: SomeModule) = UserFragmentViewModelFactory(someModule)
}
Run Code Online (Sandbox Code Playgroud)

您需要将您的移动UserFragmentModuleUserComponent

@UserScope
@Subcomponent(
  modules = [UserModule::class, UserFragmentModule::class]
)
interface UserComponent {
Run Code Online (Sandbox Code Playgroud)

你还需要注入application.userComponent到你的UserFragment

这是一篇关于子组件的好文章。我建议您阅读它以获得充分的理解。

另一种选择,我不确定这个,但也许你可以将你的 UserFragment 与你的application.userComponent.