只要活动

时间:2018-03-10 20:07:37

标签: android dagger-2 dagger

我有底栏的活动,可以切换注入galleryFrament的两个片段profilefragmentMainActivity

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

提供MainActivity的模块,范围@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> {
来自GalleryFragment的{​​{1}}注释提供了

@FragmentScoped。我从这里发布的谷歌蓝图样本中获取了注释GaleryModule@FragmentScopedhttps://github.com/googlesamples/android-architecture][google-archutecture

探测器是:当我切换片段时,创建@ActivityScoped的新实例(每次调用GalleryFrament),但我想使用以前创建的实例它。 据我了解匕首范围,onCreate()应该是GalleryFragment(只要活动存在就保持活着),但是如果我设置它,@ActivityScoped会生成与其父级具有相同范围的子组件,这是非法的。

1 个答案:

答案 0 :(得分:1)

如果您希望将片段放在活动范围内,则不得使用@ContributesAndroidInjector创建片段子组件,而不是

@FragmentScoped
@ContributesAndroidInjector
abstract fun galleryFragment(): GalleryFragment

尝试将其移动到您的伴侣中

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

或将其从GalleryFragment类中删除

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

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