我在底部栏有活动,可以切换插入到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@FragmentScoped提供GaleryModule批注。我从这里发布的Google蓝图样本中选择了注释素@FragmentScoped@ActivityScoped的方法:

该示例是:切换片段时,会创建新的GalleryFrament实例(每次都会调用onCreate()),但是我想使用以前创建的实例。
据我所知,匕首作用域应为GalleryFragment(以使其在活动持续时间内保持活动状态),但是如果我对其进行设置,@ActivityScoped会产生与其父级具有相同作用域的Subcomponent,这是非法的。

最佳答案

如果要在活动范围中包含片段,则不能使用@ContributesAndroidInjector创建片段子组件,所以不要

@FragmentScoped
@ContributesAndroidInjector
abstract fun galleryFragment(): GalleryFragment


尝试像这样在同伴中移动它

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


或从GalleryFragment类中将其删除

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


尽管我不建议这样做,但为什么要有与活动生命周期匹配的片段?

10-01 02:32