آموزش کامل Dagger Hilt + Retrofit + Jetpack Compose در اندروید
در توسعه مدرن اندروید، ترکیب Dagger Hilt برای Dependency Injection، کتابخانه Retrofit برای ارتباط با API و Jetpack Compose برای طراحی UI، یکی از بهترین و حرفهایترین معماریها را ایجاد میکند.
این ترکیب باعث میشود:
- کدها تمیزتر شوند
- مدیریت وابستگیها آسانتر شود
- توسعه پروژههای بزرگ راحتتر باشد
- تستنویسی بهتر انجام شود
- معماری MVVM حرفهایتر پیادهسازی شود
در این مقاله بهصورت کامل یاد میگیریم چگونه:
✔ Hilt را راهاندازی کنیم
✔ Retrofit را به پروژه اضافه کنیم
✔ API دریافت کنیم
✔ دادهها را در ViewModel مدیریت کنیم
✔ اطلاعات را در Compose نمایش دهیم
پیشنیازها
قبل از شروع بهتر است با موارد زیر آشنا باشید:
- Kotlin
- Android Studio
- معماری MVVM
- Coroutine
- Compose basics
Dagger Hilt چیست؟
Hilt یک کتابخانه رسمی از طرف Google Developers – Hilt Documentation برای مدیریت Dependency Injection در اندروید است.
Dependency Injection یعنی:
بهجای اینکه کلاسها وابستگیهای خود را بسازند، وابستگیها از بیرون تزریق شوند.

مزایای Hilt
✔ کاهش Boilerplate Code
✔ مدیریت lifecycle
✔ تزریق خودکار dependency
✔ مناسب MVVM
✔ سادهتر از Dagger معمولی
Retrofit چیست؟
Retrofit کتابخانهای از Square Retrofit Official Website برای ارتباط با REST API است.
ویژگیها:
- ارسال درخواست HTTP
- تبدیل JSON به Object
- پشتیبانی Coroutine
- سازگاری عالی با MVVM
Jetpack Compose چیست؟
Compose سیستم مدرن طراحی UI در اندروید است.
بهجای XML:
Text("Hello Compose")
معماری پروژه
در این آموزش ساختار پروژه به شکل زیر است:
data/
remote/
repository/
di/
ui/
viewmodel/
model/
مرحله 1 — ساخت پروژه Compose
هنگام ساخت پروژه:
✔ Empty Activity
✔ Language → Kotlin
✔ Use Jetpack Compose → فعال
مرحله 2 — اضافه کردن Dependencyها
در فایل build.gradle(:app):
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.dagger.hilt.android'
kotlin("kapt")
}
dependencies {
implementation "androidx.compose.ui:ui:1.6.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0"
// Retrofit
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
// Coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
// Hilt
implementation "com.google.dagger:hilt-android:2.50"
kapt "com.google.dagger:hilt-compiler:2.50"
// Hilt Navigation Compose
implementation "androidx.hilt:hilt-navigation-compose:1.2.0"
}
مرحله 3 — فعالسازی Hilt
در فایل پروژه:
plugins {
id("com.google.dagger.hilt.android") version "2.50" apply false
}
مرحله 4 — ساخت Application Class
@HiltAndroidApp
class MyApplication : Application()
و در Manifest:
<application
android:name=".MyApplication"
مرحله 5 — ساخت Model
فرض کنیم API کاربران داریم.
data class User(
val id: Int,
val name: String,
val email: String
)
مرحله 6 — ساخت Retrofit API
interface ApiService {
@GET("users")
suspend fun getUsers(): List<User>
}
مرحله 7 — ساخت Module برای Hilt
پکیج di
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}
مرحله 8 — Repository
class UserRepository @Inject constructor(
private val api: ApiService
) {
suspend fun getUsers(): List<User> {
return api.getUsers()
}
}
مرحله 9 — ViewModel
@HiltViewModel
class UserViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
private val _users = MutableStateFlow<List<User>>(emptyList())
val users = _users.asStateFlow()
init {
fetchUsers()
}
private fun fetchUsers() {
viewModelScope.launch {
try {
_users.value = repository.getUsers()
} catch (e: Exception) {
}
}
}
}
مرحله 10 — صفحه Compose
@Composable
fun UserScreen(
viewModel: UserViewModel = hiltViewModel()
) {
val users by viewModel.users.collectAsState()
LazyColumn {
items(users) { user ->
Card(
modifier = Modifier
.fillMaxWidth()
.padding(8.dp)
) {
Column(
modifier = Modifier.padding(16.dp)
) {
Text(text = user.name)
Spacer(modifier = Modifier.height(4.dp))
Text(text = user.email)
}
}
}
}
}
مرحله 11 — MainActivity
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
UserScreen()
}
}
}
}
جریان داده در پروژه
Compose UI
↓
ViewModel
↓
Repository
↓
Retrofit API
↓
Server
چرا Repository مهم است؟
Repository باعث میشود:
✔ منبع داده مستقل شود
✔ تغییر API راحتتر شود
✔ ViewModel سادهتر شود
استفاده از StateFlow
در پروژههای جدید:
✅ StateFlow بهتر از LiveData است
مزایا:
- Coroutine Friendly
- سریعتر
- مدرنتر
- مناسب Compose
مدیریت State حرفهای
بهتر است state جداگانه داشته باشیم:
data class UserState(
val isLoading: Boolean = false,
val users: List<User> = emptyList(),
val error: String = ""
)
ViewModel حرفهایتر
private val _state = MutableStateFlow(UserState())
val state = _state.asStateFlow()
مدیریت Loading
_state.value = UserState(isLoading = true)
مدیریت Error
catch (e: Exception) {
_state.value = UserState(
error = e.message ?: "Unknown Error"
)
}
مزایای ترکیب Hilt + Retrofit + Compose
✔ معماری تمیز
کدها جدا و خوانا هستند.
✔ توسعه سریعتر
Dependencyها خودکار تزریق میشوند.
✔ تستپذیری بالا
Repository و ViewModel راحت Mock میشوند.
✔ مناسب پروژههای بزرگ
کاملاً scalable است.
پیشنهاد ساختار حرفهای پروژه
com.example.app
├── data
│ ├── remote
│ ├── repository
│
├── di
│
├── model
│
├── ui
│ ├── screens
│ ├── components
│
├── viewmodel
بهترین روشهای حرفهای
از Result Wrapper استفاده کن
sealed class Resource<T> {
class Success<T>(val data: T) : Resource<T>()
class Error<T>(val message: String) : Resource<T>()
class Loading<T> : Resource<T>()
}
از UseCase در پروژههای بزرگ استفاده کن
ViewModel
↓
UseCase
↓
Repository
از Navigation Compose استفاده کن
کتابخانه رسمی:
implementation "androidx.navigation:navigation-compose:2.7.7"
Hilt در Compose
برای گرفتن ViewModel:
val viewModel: UserViewModel = hiltViewModel()
تفاوت Hilt و Dagger
| ویژگی | Dagger | Hilt |
|---|---|---|
| Boilerplate | زیاد | کم |
| یادگیری | سخت | سادهتر |
| مناسب Android | متوسط | عالی |
| سرعت توسعه | کمتر | بیشتر |
خطاهای رایج
فراموش کردن kapt
kapt "com.google.dagger:hilt-compiler:2.50"
فراموش کردن @AndroidEntryPoint
باعث Crash میشود.
baseUrl بدون /
اشتباه:
"https://api.test.com"
درست:
"https://api.test.com/"
جمعبندی
ترکیب:
- Jetpack Compose
- Retrofit
- Dagger Hilt
- MVVM
- StateFlow
امروزه استاندارد توسعه مدرن اندروید محسوب میشود.
با این ساختار میتوانید:
✔ اپلیکیشنهای حرفهای بسازید
✔ پروژههای بزرگ را مدیریت کنید
✔ کد تمیز و scalable داشته باشید
✔ توسعه تیمی راحتتری انجام دهید