我通过 Hilt 将
MyObject
注入 FirstFragment
中,此片段替换为另一个片段,并且如您所知,当一个片段替换为另一个片段时,会调用 onDestroyView()
,当您按回键时,将创建视图再次。
每当创建片段的视图时,我都需要创建
MyObject
的新实例。在 Koin 中,我可以使用 get<MyObject>()
直接在代码中获取实例,但在 Hilt 中,我找不到任何内容,必须将其作为构造函数或属性注入。
我还尝试使用
ViewWithFragmentComponent
来更改我的范围,但是当我使用它而不是 ApplicationComponent
时出现错误
每当在片段中创建视图时,如何才能拥有
MyObject
的新实例?
@AndroidEntryPoint
class FirstFragment : BaseFragment(){
@Inject lateinit var myObject: MyObject
}
@InstallIn(ViewWithFragmentComponent::class)
@Module
object MyModule{
@Provides
internal fun provideMyObject(): MyObject {
...
}
}
要直接从 hilt 获取实例,您应该使用 EntryPoint 注释:
示例代码可以在这里找到: https://developer.android.com/codelabs/android-hilt#10
步骤如下:
在非 Hilt 感知类中声明一个接口,该接口实现返回要从 Hilt 检索的实例接口的方法。
将此接口注释为
@InstallIn(SingletonComponent::class)
@EntryPoint
假设您的实例是单例,所以它看起来如下:
class MyAnyKindOfClass {
@InstallIn(SingletonComponent::class)
@EntryPoint
interface MyObjectEntryPoint{
fun getMyObject(): MyObject;
}
fun getMyObject(): MyObject {
val hiltEntryPoint = EntryPointAccessors.fromApplication(
appContext, // You need to provid ApplicationContext
MyObjectEntryPoint::class.java)
return hiltEntryPoint.getMyObject()
}
}
据我所知,每当您将某些东西注入到片段中并且该片段被破坏时,注入的对象也会被破坏。因此,在您的示例中,当调用
onDestroyView()
时,myObject
将被垃圾收集。单击后退按钮将触发 onCreateView()
并且匕首柄将自动提供 myObject.
的新实例
如果你总是想要同一个对象,你必须用@Singleton注释它。可选,您还可以使用@FragmentScoped,文档中说:
在片段生命周期内应存在的绑定的范围注释。
但在我看来,这是不需要的,因为我个人发现,当片段被重新创建时,匕首柄提供的对象也会被重新创建。使用
@FragmentScope
让我的生活变得更加困难,因为它引入了一些其他错误。
您可以查看此处以了解有关范围界定和 dagger-hilt 功能的更多信息