برنامه‌نویسی اندروید

آموزش کامل Dagger Hilt + Retrofit + Jetpack Compose در اندروید

آموزش کامل 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 یعنی:
به‌جای اینکه کلاس‌ها وابستگی‌های خود را بسازند، وابستگی‌ها از بیرون تزریق شوند.

Dagger Hilt و Compose

 مزایای 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 داشته باشید
✔ توسعه تیمی راحت‌تری انجام دهید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *