Ý 自動 依賴 注入 , 維持 專案 可 維護 , 由 ý ka ka ka 上 構建 而成 而成 的。
要用 要用 ¿Hit?
- 一 一 組 標準 的 組件 和 作用域 , 以 簡化 設置 、 提高 可讀性 以及 在 應用 之間 共享 代碼。
- 一種 一種 簡單 的 方法 來 為 各種 構建 類型 (如 測試 、 調試 或 發布) 配置 不同 的 。。
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