簡體   English   中英

使用 Hilt 注入 Activity

[英]Inject into Activity using Hilt

如何在擴展 Activity 而不是 AppCompatActivity 的 class 中注入 retrofit 實例? 這是模塊:

@InstallIn(SingletonComponent::class)
object Module {
    private const val BASE_URL = "API_URL_HERE"

    @Singleton
    @Provides
    fun provideRetrofitApi(): Api {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(Api::class.java)
    }
}

這是我的主要活動:

@AndroidEntryPoint
class MainActivity : Activity() {
    ...
    @Inject
    lateinit var api: Api
    ...

這導致

使用@AndroidEntryPoint 注解的Activity 必須是androidx.activity.ComponentActivity 的子類。 (例如 FragmentActivity、AppCompatActivity 等) [Hilt] 處理未完成。 有關詳細信息,請參閱上面的錯誤。

我嘗試使用@ActivityScoped而不是@AndroidEntryPoint但它導致

kotlin.UninitializedPropertyAccessException:lateinit 屬性 api 尚未初始化。

您忘記使用@Module注釋來裝飾您的模塊。

@Module
@InstallIn(SingletonComponent::class)
object Module {
    private const val BASE_URL = "API_URL_HERE"

    @Singleton
    @Provides
    fun provideRetrofitApi(): Api {
         return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(Api::class.java)
    }

}

為什么不擴展 ComponentActivity? 這是 Hilt 的已知要求。

但是如果你真的不能,那么使用 @EntryPoint 注釋創建一個入口點。

https://developer.android.com/training/dependency-injection/hilt-android#not-supported

    val hiltEntryPoint =
      EntryPointAccessors.fromApplication(appContext, ExampleContentProviderEntryPoint::class.java)

    val analyticsService = hiltEntryPoint.analyticsService()

從您的活動 onCreate 中調用它,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM