Hilt - 片段中的入口点

Hilt - EntryPoint in Fragment

我正在为 DI 使用 Hilt,我有这个 class。

class ChatCore @Inject constructor()

此 class 需要注入到片段中,而不会将片段标记为 @AdroidEntryPoint,因为此片段可以附加到未标记为 @AndroidEntryPoint 的 activity ]

我怎样才能做到这一点。我尝试使用 EntryPoint 但最终出现错误。

class MyFragment : Fragment() {

  lateinit var chatCore: ChatCore 

  @EntryPoint
  @InstallIn(FragmentComponent::class)
  interface ChatCoreProviderEntryPoint{
    fun chatCore():ChatCore
  }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val hiltEntryPoint = EntryPointAccessors.fromFragment(this, ChatCoreProviderEntryPoint::class.java)
    chatCore = hiltEntryPoint.chatCore()
  }

通过将其添加到应用程序容器中解决。

      @EntryPoint
      @InstallIn(ApplicationComponent::class)
      interface ChatCoreProviderEntryPoint{
        fun chatCore():ChatCore
      }


      val hiltEntryPoint = EntryPointAccessors.fromApplication(applicationContext,
         ChatCoreProviderEntryPoint::class.java)

如果您不想为您的 Fragment 使用 AndroidEntryPoint,您需要 @Install 您的模块(包含您的依赖项)在不同的 Component 中。 例如。在 ApplicationComponent 内而不是 FragmentComponent.

那么你还需要使用相应的EntryPointAccessors.fromXyz(...)方法。例如。对于安装在 ApplicationComponent 中的模块,您应该使用 EntryPointAccessors.fromApplication(...).