当前位置: 首页 > 知识库问答 >
问题:

匕首2组件保持旧参考

公良安邦
2023-03-14

我在应用程序中有多个匕首瞄准镜

  • UserScope-范围表示用户会话
  • ActivityScope-每个活动的范围
  • UserComponent-CoreComponent的子组件
  • UserManager-创建UserComponent的单例程序
  • HomeComponent-依赖于UserComponent的组件

我试图在UserScope下更新用户对象,但不知何故,对象更新没有反映在它的依赖组件上。因此,一旦更新屏幕更新了用户对象,backstack中的活动就会收到更新事件

>

  • 用户登录并打开主屏幕。此时,我的用户管理器已经使用从API调用获得的用户对象创建了用户组件。

    主屏幕打开更新屏幕,通过在UserManager内部重新创建新的userComponent来更新用户。这还会触发一个事件,告知主屏幕获取更新的用户对象。

    主屏幕接收事件。然而,HomeViewModel(背面的屏幕)仍然是指dagger注入的旧用户对象。

    • 这是因为HomeComponent是独立组件吗?所以,它保留了一个旧的参考
    • 有没有办法实现此更新?
      • 最好不使用子组件。因为我使用的是一个多模块(动态功能)设置,如果我把它作为一个单独的组件来处理,它会帮助我
      @Singleton
      @Component
      interface CoreComponent {
      
          val userBuilder: UserComponent.Builder
      
          val userManager: UserManager
      
          fun providerContext(): Context
      
          fun inject(activity: UserActivity)
      
          @Component.Factory
          interface Factory {
              fun create(
                  @BindsInstance applicationContext: Context
              ): CoreComponent
          }
      }
      
      @UserScope
      @Subcomponent
      interface UserComponent {
      
          val userManager: UserManager
      
          @UserScope
          val user: User
      
          @Subcomponent.Builder
          interface Builder {
      
              fun bindUser(@BindsInstance user: User): Builder
              fun build(): UserComponent
          }
      }
      
      @Singleton
      class UserManager @Inject constructor(private val userBuilder: UserComponent.Builder) {
      
          var userComponent: UserComponent? = null
              private set
      
          init {
              // creating as a dummy reference
              createUser(User("1", "1"))
          }
      
          fun createUser(user: User) {
              userComponent = null
              userComponent = userBuilder.bindUser(user).build()
          }
      
          fun logout() {
              userComponent = null
          }
      }
      
      @Component(
          modules = [HomeModule::class],
          dependencies = [UserComponent::class]
      )
      @ActivityScope
      interface HomeComponent {
      
          fun inject(activity: HomeActivity)
      
          @Component.Factory
          interface Factory {
              fun create(
                  @BindsInstance applicationContext: HomeActivity,
                  coreComponent: UserComponent,
              ): HomeComponent
          }
      }
      
      @Module
      class HomeModule {
      
          @ActivityScope
          @Provides
          fun provideVM(activity: HomeActivity, user: User): HomeViewModel {
              val vm by activity.scopedComponent {
                  HomeViewModel(user)
              }
              return vm
          }
      }
      

  • 共有1个答案

    全心思
    2023-03-14

    如果您有组件A-

    在本例中,您还需要重新创建C(这次使用B*),以获得C*(使用新的依赖项)。现在您有了新的组件A-

    e、 g.在一个允许在用户之间切换的应用程序中,我的主要活动是“Singleton”-

     类似资料:
    • 我不太清楚如何用匕首2解决这个问题。假设我们有为我们提供,那么我们有只使用这一个模块。在此基础上,我们有和,它们依赖于<代码>活动组件的构建与 然后我注入我的活动: 现在我可以使用中声明的所有内容,但是我无法访问。 所以问题是如何实现这一目标?所以,当我构建依赖于另一个组件的组件时,我仍然可以从第一个组件访问模块? 我想我已经找到了解决方案,在重新观看了Jake的Devxx演讲之后,我不得不错过了

    • 我对匕首2还不太熟悉。我正试图在我的Android项目中实现它。我有一个需要。我用匕首把它注射到这个服务中。 、和具有标记为的方法当我构建项目时,我收到以下错误: locationServiceComponent依赖于多个作用域组件:@Singleton NetComponent@Singleton RepositoryComponent 我知道我的不能依赖于两个作用域组件,但我的服务中需要这两个

    • Dagger 2即将面世,但可用的示例甚至无法立即编译,文档是Dagger 1的复制粘贴替换。 有没有人有一个在谷歌的Dagger 2上运行的正确应用程序的例子?

    • 问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都

    • 我在android项目中使用Dagger2我有两个作用域:ActivityScope和FragmentScope我读了一些示例代码,他们说定义并使用ActivityScope,所以对象将在activity lifecycle中销毁。因为活动和片段有不同的生命周期,所以我们应该有两个作用域。 我的问题是:我是否需要做一些事情让代码知道,当我使用ActivityScope时,对象应该随活动生命周期一起

    • 基于本教程使用Dagger Hilt添加子组件需要 这就是如何创建子组件 我的问题是如何实现 因为它没有显示它是如何提供给UserManager类的 我正在尝试创建一个AppComponent来测试子组件如何与Dagger Hilt一起工作 并在应用中 我应该如何在中创建构建器,创建实现Provider的匿名类不正确吗?