直接从 Hilt 获取实例

问题描述 投票:0回答:2

我通过 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 {
        ...
    }
}
android kotlin dependency-injection dagger-hilt
2个回答
2
投票

要直接从 hilt 获取实例,您应该使用 EntryPoint 注释:

示例代码可以在这里找到: https://developer.android.com/codelabs/android-hilt#10

步骤如下:

  1. 在非 Hilt 感知类中声明一个接口,该接口实现返回要从 Hilt 检索的实例接口的方法。

  2. 将此接口注释为

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

0
投票

据我所知,每当您将某些东西注入到片段中并且该片段被破坏时,注入的对象也会被破坏。因此,在您的示例中,当调用

onDestroyView()
时,
myObject
将被垃圾收集。单击后退按钮将触发
onCreateView()
并且匕首柄将自动提供
myObject.

的新实例

如果你总是想要同一个对象,你必须用@Singleton注释它。可选,您还可以使用@FragmentScoped,文档中说:

在片段生命周期内应存在的绑定的范围注释。

但在我看来,这是不需要的,因为我个人发现,当片段被重新创建时,匕首柄提供的对象也会被重新创建。使用

@FragmentScope
让我的生活变得更加困难,因为它引入了一些其他错误。

您可以查看此处以了解有关范围界定和 dagger-hilt 功能的更多信息

© www.soinside.com 2019 - 2024. All rights reserved.