代码之家  ›  专栏  ›  技术社区  ›  Boris Rozhkovsky

Android Dagger 2保持碎片与活动时间相同

  •  1
  • Boris Rozhkovsky  · 技术社区  · 6 年前

    我有底部栏的活动,它切换两个片段 galleryFrament profilefragment ,注入 MainActivity :

    class MainActivity : DaggerAppCompatActivity(), MainContract.View {
    
    @Inject
    lateinit var galleryFragment: GalleryFragment
    
    @Inject
    lateinit var profileFragment: ProfileFragment
    

    我以这种方式在它们之间切换:

    val transaction = fragmentManager.beginTransaction()
    transaction.replace(frameId, fragment)
    transaction.commit()
    

    模块提供 主要活动 ,具有范围 @ActivityScoped :

      @Module
      abstract class ActivityBindingModule {
    
        @ActivityScoped
        @ContributesAndroidInjector(modules = arrayOf(MainModule::class, GalleryModule::class, ProfileModule::class))
        internal abstract fun mainActivity(): MainActivity
    

    模块提供 GalleryFragment :

      @Module
    internal abstract class GalleryModule {
    
        @FragmentScoped
        @ContributesAndroidInjector
        abstract fun galleryFragment(): GalleryFragment
    
        @ActivityScoped
        @Binds
        abstract fun galleryPresenter(galleryPresenter: GalleryPresenter): GalleryContract.Presenter
    
    
        @Module
        companion object {
            @ActivityScoped
            @Provides
            @JvmStatic
            fun galleryAdapter(context: Context): GalleryAdapter {
                return GalleryAdapter(context);
            }
        }
    }
    

    最后 AppComponent :

    @Singleton
    @Component(modules = arrayOf(ImagesRepositoryModule::class,
            ApplicationModule::class,
            ActivityBindingModule::class,
            AndroidSupportInjectionModule::class,
            EventsModule::class))
    interface AppComponent : AndroidInjector<MyApplication> {
    

    厨房碎片 提供了 @FragmentScoped 批注来源 GaleryModule 。我吃了一片注释 @碎片范围的 @活动范围 来自此处发布的谷歌蓝图样本: https://github.com/googlesamples/android-architecture][google-archutecture

    问题是: 当我切换片段时 GalleryFrament 已创建( onCreate() 每次调用),但我想使用以前创建的实例。 据我所知,匕首瞄准镜, 厨房碎片 应该是 @活动范围 (只要活动还活着,它就一直活着),但如果我设置它, @ContributesAndroidInjector 生成与其父组件作用域相同的子组件,这是非法的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Samuel Eminet    6 年前

    如果您希望在活动范围中包含片段,则不能使用创建片段子组件 @ContributesAndroidInjector 因此

    @FragmentScoped
    @ContributesAndroidInjector
    abstract fun galleryFragment(): GalleryFragment
    

    试着像这样在你的同伴身上移动它

    @Provides
    @ActivityScoped
    @JvmStatic
    fun galleryFragment(): GalleryFragment = GalleryFragment.newInstance()
    

    或者将其从GalleryFragment类中删除

    @ActivityScope
    class GalleryFragment 
    @Inject
    constructor() : Fragment()
    

    虽然我不建议这样做,但为什么您希望有与活动生命周期匹配的片段?