Android-Hit 提供 ka 依賴 注入 , 維持 專案 可 維護 , 由 ý ka ka ka 上 上 構建 的。 | de miles | Octubre de 2020

Ý 自動 依賴 注入 , 維持 專案 可 維護 , 由 ý ka ka ka 上 構建 而成 而成 的。

要用 要用 ¿Hit?

  1. 一 一 組 標準 的 組件 和 作用域 , 以 簡化 設置 、 提高 可讀性 以及 在 應用 之間 共享 代碼。
  2. 一種 一種 簡單 的 方法 來 為 各種 構建 類型 (如 測試 、 調試 或 發布) 配置 不同 的 。。

Manejar 以下 支持 以下 Android 類

  • Application使用 通過 使用 @HiltAndroidApp
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver

Hit 導入

Android Studio 4.0, 更高 版本 , build.gradle 裡 加入 依賴(最新 最新)以下 以下 範例。

buildscript {
...
ext.hilt_version = '2.28-alpha'
dependencies {
...
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}

app/build.gradle 加入 加入 以下 範例。

apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
...
}

dependencies {
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}

Aplicaciones 使用

@HiltAndroidApp 觸發 觸發 Hilt 的 代碼 生成 操作 , 以下 範例。

@HiltAndroidApp
class ExampleApplication : Application() { ... }

Actividad 使用

@AndroidEntryPoint 讓 讓 Pulse 知道 需要 依賴 , 以下⁇

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { ... }

定義 Mango 綁定

Empuñadura 提供 綁定 信息 的 一種 方法 是 構造 函數 注入。 在 某個 類 的 構造 函數 中 使用 @Inject 註釋 , 以下 範例。

class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
) { ... }

Manejar 和 ViewModel

在 ViewModel , , application / build.gradle 在 加入 以下 範例。

...
dependencies {
...
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
// When using Kotlin.
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
// When using Java.
annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
}

ViewModel 在 , 使用 以下 範例。

class ExampleViewModel @ViewModelInject constructor(
private val repository: ExampleRepository,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
...
}

帶有 , 帶有 @AndroidEntryPoint 註釋 的 actividad 或 fragmento 可以 可以 ViewModelProvider 或 por viewModels () , 以下 範例。

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
private val exampleViewModel: ExampleViewModel by viewModels()
...
}

Manejar 和 WorkManager

app / build.gradle , 加入 以下 範例。

...
dependencies {
...
implementation 'androidx.hilt:hilt-work:1.0.0-alpha01'
// When using Kotlin.
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
// When using Java.
annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
}

在 Worker 對象 的 構造 函數 中 使用 @WorkerInject 註釋 來 注入 一個 Worker。 只能 在 Worker 對 像 中 使用 @Singleton 或未 限定 作用域 的 綁定。 還 必須 使用 @ Assisted 為 Context 和 WorkerParameters , 以下 範例。

class ExampleWorker @WorkerInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters,
workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

讓 讓 讓 Aplicaciones 實現 實現 Configuration.Provider , , , HiltWorkFactory 傳入 實例 , 並將 其 傳入 WorkManager 配置 , 以下 範例。

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

@Inject lateinit var workerFactory: HiltWorkerFactory

override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}

@Enlaza 使用

Ilt 有 一個 接口 , 無法 通過 構造 函數 注入 它 而 而 應向 Hilt 提供 綁定 信息 , 方法 是 在 Hilt 模塊 內 創建 一個 帶有 @Binds 註釋 的 抽象 函數 , 以下 範例。

interface AnalyticsService {
fun analyticsMethods()
}

// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
...
) : AnalyticsService { ... }

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {

@Binds
abstract fun bindAnalyticsService(
analyticsServiceImpl: AnalyticsServiceImpl
): AnalyticsService
}

使用 @Proporciona

Rof 不是 無法 通過 構造 函數 注入 類型 的 唯一 一種 情況。 如果 某個 類 (來自 外部 庫 , 如 Retrofit 、 OkHttpClient 或 Room 數據庫 等 類) , 或者 必須 使用 構建 器 模式 實例 通過 使用 無法 通過 構造Proporciona alojamiento y desayuno

@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {

@Provides
fun provideAnalyticsService(
// Potential dependencies of this type
): AnalyticsService {
return Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(AnalyticsService::class.java)
}
}

Ilt 向 的 函數 會 ilt Hilt

  • Ilt 告知 類型 會 告知 Hilt 函數 哪個 類型 的 實例
  • 告知 參數 會 告知 Empuñadura
  • 告知 主體 會 告知 Hilt 如何 提供 相應 的 的。 每當 需要 提供 該 類型 , , Hilt 都會 執行 函數 主體

同一 同一 類型 提供 多個 綁定

Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla Arcilla

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class AuthInterceptorOkHttpClient

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class OtherInterceptorOkHttpClient

, , Hilt 需要 知道 如何 提供 與 每個 限定符 對應 的 類型 的 實例。 在 這種 下 , 使用 帶有 @Provides 的 Hilt 模塊。 這 兩種 方法 具有 相同 的 返回 類型 , 它們 將 將 將 為 為不同 不同 的 綁定 , 以下 範例。

@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {

@AuthInterceptorOkHttpClient
@Provides
fun provideAuthInterceptorOkHttpClient(
authInterceptor: AuthInterceptor
): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(authInterceptor)
.build()
}

@OtherInterceptorOkHttpClient
@Provides
fun provideOtherInterceptorOkHttpClient(
otherInterceptor: OtherInterceptor
): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(otherInterceptor)
.build()
}
}

作用域 作用域

使用 使用 @ActivityScoped 將 AnalyticsAdapter 為 作用域 限定 為 ActivityComponent , Hilt 會 在 相應 Activity 的 整個 生命 週期 內 提供 AnalyticsAdapter 的 同一 實例 , 以下 範例。

@ActivityScoped
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
) { ... }

參考資料

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *