如何在Android Kotlin中使用Dagger或Hilt实现依赖注入来获取API?

问题描述 投票:0回答:1

我正在使用 Kotlin 构建 Android 应用程序,并希望使用 Dagger 或 Hilt 实现依赖注入 (DI)。我的用例涉及使用 Retrofit 从 REST API 获取数据。

我正在寻找一个清晰的示例来说明如何:

  1. 设置 Hilt 或 Dagger 进行依赖注入。
  2. 注入依赖项,例如 Retrofit 和存储库类。
  3. 在 ViewModel 中使用 DI 来获取 API 数据。

这是我迄今为止尝试过的:

  • 在 build.gradle 中添加了 Hilt/Dagger 和 Retrofit 的依赖项。
  • 定义了一个Retrofit实例,但我不知道如何将其集成到Hilt/Dagger中。
  • 努力理解如何正确提供和注入依赖项。

我需要什么:

  • 显示 Hilt/Dagger 设置的完整示例或指南,包括 @Module、@Inject 以及 Activity/Fragment 中的用法。
  • 使用 DI 管理依赖项(例如存储库或 API 服务)的最佳实践。
android kotlin dependency-injection dagger-hilt dagger
1个回答
0
投票

我想我有查询的解决方案。 我已经尝试过这种方法,它会对你有用。

以下是依赖注入的一些实现步骤。

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 是您的数据类,并且可能会更长,所以我在这里提到了。

© www.soinside.com 2019 - 2024. All rights reserved.