我有一个带有底部栏的活动,它切换两个片段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提供了来自GaleryModule的@FragmentScoped注释。我从张贴在这里的google蓝图样本中提取了带注释的https://github.com/googlesamples/android-architecture(https://github.com/googlesamples/android-architecture][google-archutecture) @FragmentScoped和@ActivityScoped示例。
probem是:,当我切换片段时,会创建GalleryFrament的新实例(每次调用onCreate()),但我希望使用以前创建的实例。正如我所理解的那样,GalleryFragment应该是@ActivityScoped(为了使它在活动存续期间保持活力),但是如果我设置它,@ContributesAndroidInjector会生成与其父组件相同范围的子组件,这是非法的。
发布于 2018-03-10 22:13:16
如果您想让您的片段在您的活动范围内,您就不能用@ContributesAndroidInjector来创建片段子组件,而不是
@FragmentScoped
@ContributesAndroidInjector
abstract fun galleryFragment(): GalleryFragment试着像这样把它移到你的同伴身上
@Provides
@ActivityScoped
@JvmStatic
fun galleryFragment(): GalleryFragment = GalleryFragment.newInstance()或者从GalleryFragment类中删除它
@ActivityScope
class GalleryFragment
@Inject
constructor() : Fragment()虽然我不想这样做,但为什么要有与活动生命周期相匹配的片段呢?
https://stackoverflow.com/questions/49213525
复制相似问题