我正在使用 Kotlin 构建 Android 应用程序,并希望使用 Dagger 或 Hilt 实现依赖注入 (DI)。我的用例涉及使用 Retrofit 从 REST API 获取数据。
我正在寻找一个清晰的示例来说明如何:
这是我迄今为止尝试过的:
我需要什么:
我想我有查询的解决方案。 我已经尝试过这种方法,它会对你有用。
以下是依赖注入的一些实现步骤。
1。添加 Hilt 依赖项 在您的 build.gradle 文件中添加必要的依赖项:.
将其添加到您的应用程序 build.gradle.kts 文件中
dependencies {
ksp("com.google.dagger:hilt-compiler:2.48") // for dagger
implementation("com.google.dagger:hilt-android:2.48") // for hilt
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1") // viewmodel
implementation("com.squareup.retrofit2:converter-gson:2.9.0") // retrofit
implementation("com.google.code.gson:gson:2.10.1") // gson
}
并将其添加到您的项目 build.gradle.kts 文件中
plugins {
id("com.android.library") version "8.0.2" apply false
id("com.google.dagger.hilt.android") version "2.48" apply false
id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false
}
将此插件 ID 添加到您的应用程序 build.gradle.kts 文件中
plugins {
id("com.google.dagger.hilt.android")
id("com.google.devtools.ksp")
}
现在完美了,我们已经完成了依赖步骤。
我们将进入实施步骤。
2。在应用程序类中初始化 Hilt 使用 @HiltAndroidApp 注释您的应用程序类
@HiltAndroidApp
class WeatherApplication : Application()
3.创建网络模块定义Hilt模块,提供Retrofit、OkHttpClient等依赖。
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.weatherapi.com/v1/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
fun provideWeatherApi(retrofit: Retrofit): WeatherApi {
return retrofit.create(WeatherApi::class.java)
}
}
4。创建 API 接口 为 API 端点定义接口。
import retrofit2.http.GET
import retrofit2.http.Query
interface WeatherApi {
@GET("forecast.json")
suspend fun getCurrentWeather(
@Query("key") apiKey: String,
@Query("q") location: String,
@Query("days") days: Int,
@Query("aqi") aqi: String,
@Query("alerts") alerts: String
): WeatherResponse
}
5。创建存储库 在存储库类中使用 WeatherApi。使用 @Inject 标记类以启用依赖注入。
import javax.inject.Inject
class WeatherRepository @Inject constructor(private val api: WeatherApi) {
suspend fun fetchWeather(location: String): WeatherResponse {
return api.getCurrentWeather("your-api-key", location, 7, "yes", "yes")
}
}
6。创建 ViewModel 在 ViewModel 中使用存储库。使用@HiltViewModel注释ViewModel。
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class WeatherViewModel @Inject constructor(
private val repository: WeatherRepository
) : ViewModel() {
private val _weatherData = MutableLiveData<WeatherResponse>()
val weatherData: LiveData<WeatherResponse> get() = _weatherData
fun loadWeather(location: String) {
viewModelScope.launch {
try {
val weather = repository.fetchWeather(location)
_weatherData.value = weather
} catch (e: Exception) {
// Handle error
}
}
}
}
7。在 Activity 或 Fragment 中注入依赖项 使用 @AndroidEntryPoint 注解在 Activity 或 Fragment 中启用依赖项注入。
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.test.databinding.ActivityMainBinding
import com.example.test.di.WeatherViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class WeatherActivity : AppCompatActivity() {
private val viewModel: WeatherViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_weather)
viewModel.weatherData.observe(this) { weather ->
// Update UI with weather data
}
// Fetch weather for a location
viewModel.loadWeather("New York")
}
}
请记住一件事,WeatherResponse 是您的数据类,并且可能会更长,所以我在这里提到了。