我有底栏的活动,可以切换注入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()
提供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
和@FragmentScoped
:https://github.com/googlesamples/android-architecture][google-archutecture
探测器是:当我切换片段时,创建@ActivityScoped
的新实例(每次调用GalleryFrament
),但我想使用以前创建的实例它。
据我了解匕首范围,onCreate()
应该是GalleryFragment
(只要活动存在就保持活着),但是如果我设置它,@ActivityScoped
会生成与其父级具有相同范围的子组件,这是非法的。
答案 0 :(得分:1)
如果您希望将片段放在活动范围内,则不得使用@ContributesAndroidInjector
创建片段子组件,而不是
@FragmentScoped
@ContributesAndroidInjector
abstract fun galleryFragment(): GalleryFragment
尝试将其移动到您的伴侣中
@Provides
@ActivityScoped
@JvmStatic
fun galleryFragment(): GalleryFragment = GalleryFragment.newInstance()
或将其从GalleryFragment类中删除
@ActivityScope
class GalleryFragment
@Inject
constructor() : Fragment()
虽然我不建议这样做,但为什么要让片段与您的活动生命周期相匹配?