Android Fragments 匕首柄:父片段/子片段的作用域依赖关系

mfpqipee  于 2023-02-23  发布在  Android
关注(0)|答案(2)|浏览(136)

我试图找到一个解决方案,在如何定义在某个片段相关的场景中的刀柄。我有以下设置:

  • 活动
  • 亲本片段1
  • 子片段1
  • 子片段2
  • ...
  • 子片段n-1
  • 亲本片段2
  • 子片段1
  • 子片段2
  • ...
  • 子片段n-1

父片段1正在使用依赖项A。该依赖项的示例是我只想在该父片段和它的所有子片段之间共享的东西。父片段2 +其子片段应该使用与父片段1 +子片段不同的示例。通常,他的结构应该只有任何给定依赖项的两个示例-一个用于第一流,一个用于第二流。
我可以看到一个自定义范围可能在这里工作,但我不确定如何使用有关的刀柄。

91zkwejq

91zkwejq1#

实现目标的一种方法是利用Hilt的默认绑定(在本例中为Fragment)和dagger Qualifier注解。
在你的第一个父片段中,你有你的片段作用域和限定绑定,比如

@AndroidEntryPoint
class ParentFragment1 : Fragment {

  @Inject
  @ParentFragment1
  lateinit var binding: Binding
}

而在ChildFragment1中,Binding是不合格的,我们将提供一种方法,让dagger根据传递给fragment bundle的fragment参数注入适当的绑定

@AndroidEntryPoint
class ChildFragment1 : Fragment {

  @Inject
  lateinit var binding: Binding
}

在dagger模块中,您可以根据我们在ChildFragment1创建过程中传递给bundle的参数,指定为ChildFragment1提供哪种合格出价。

@InstallIn(FragmentComponent::class)
@Module
class FragmentModule {
 
  @Provides
  fun provieBinding(
     fragment:Fragment, // default binding in FragmentComponent
     @ParentFragment1 bindingOne: Binding,
     @ParentFragment2 bindingTwo: Binding,
  ): Binding {
    retrun when(fragment.arguments.getParcelable(KEY)){
       is FRAGMENT1 -> bindingOne
       is FRAGMENT2 -> bindingTwo
    }
  }

  @Provides
  @ParentFragment1
  fun providesParentFragment1QualifiedBinding(): Binding {
      return Binding()
  }

  @Provides
  @ParentFragment2
  fun providesParentFragment1QualifiedBinding(): Binding {
      return Binding()
  }

   enum class ContentState {
        FRAGMENT1,
        FRAGMENT2,
   }

   @Qualifier
   @Retention(AnnotationRetention.RUNTIME)
   annotation class ParentFragment1

   @Qualifier
   @Retention(AnnotationRetention.RUNTIME)
   annotation class ParentFragment2
}
kadbb459

kadbb4592#

您可以使用dagger-hilt在每个父Fragment和其子视图中添加@AndroidEntryPoint来实现这一点。然后您的Parent Fragment 1Parent Fragment 2将具有不同的fragment作用域和不同的示例,如dagger-hilt所述。请参见dagger-hilt的以下注解:
一个常见的误解是所有片段示例将共享@FragmentScoped范围内的绑定的同一个示例。然而,这不是真的。每个片段示例获得片段组件的一个新示例,从而获得其所有范围内绑定的一个新示例。
另请参见下文的匕首图和内窥镜层次结构:

更多详细信息,请参阅documentation
此外,除非确实需要,否则不要使用自定义作用域,因为它会带来性能和开销问题。

相关问题