Romm قسمت 2 ـ‌ آموزش کامل پیاده‌سازی Hilt در اندروید در Jetpack Compose

آموزش پیاده‌سازی Room (2)_ پیاده‌سازی Hilt

hilt! تا حالا شده توی پروژه‌هاتون از حجم زیاد کد و شلوغی برای مدیریت وابستگی‌ها خسته بشین؟ مثلاً بخواین یک ViewModel رو به Repository و اون رو به دیتابیس Room وصل کنین و ببینید چقدر کد تکراری باید بنویسید؟

اینجاست که Hilt میاد وسط و کار رو برای همه آسون می‌کنه! Hilt یه کتابخونه از طرف گوگل برای تزریق وابستگی (Dependency Injection) توی اندرویده که روی Dagger ساخته شده.

اینجا می‌خوایم قدم به قدم ببینیم چطور می‌شه Hilt رو توی یه پروژه اندروید با Kotlin و Jetpack Compose پیاده‌سازی کرد و یه کد تمیز و مرتب نوشت. توجه کنید که این آموزش در ادامه آموزش پیاده‌سازی Room در پروژه های کامپوز اندروید هست.

چرا Hilt؟

  • کد کمتر، کار بیشتر: Hilt کلی از کدهای تکراری رو حذف می‌کنه.
  • کد تمیز و قابل فهم: وقتی وابستگی‌ها رو جدا می‌کنید، کدتون مثل یه کتاب مرتب می‌شه و راحت می‌تونید بخونید و تغییرش بدید.
  • مدیریت هوشمند: Hilt خودش حواسش به چرخه حیات کامپوننت‌ها (مثل Activity یا ViewModel) هست و آبجکت‌ها رو درست سر جای خودشون می‌سازه. مثلاً با @Singleton تضمین می‌کنه که از یه آبجکت مهم (مثل دیتابیس) فقط یه دونه توی کل برنامه ساخته بشه.
  • تست‌نویسی راحت: وقتی وابستگی‌ها تزریق می‌شن، تست‌نویسی خیلی راحت‌تر می‌شه، چون می‌تونید به جای آبجکت اصلی، نسخه‌های تستی (Mock) رو به کدتون بدید.

چطور Hilt رو به پروژه‌مون اضافه کنیم؟

برای پیاده‌سازی Hilt، این مراحل ساده رو دنبال کنید. این روش دقیقاً مثل همون چیزیه که توی مستندات رسمی گوگل گفته شده.

قدم اول: وابستگی‌ها رو اضافه کن

اول باید پلاگین و کتابخونه‌های Hilt رو به فایل‌های build.gradle.kts پروژه‌تون اضافه کنید.

فایل build.gradle.kts (پروژه):

این خط رو به پلاگین‌ها اضافه کنید:

plugins {
    ...
      id("com.google.dagger.hilt.android") version "2.56.2" apply false
}

نکته: همیشه سعی کنید از آخرین ورژن Hilt استفاده کنید. اینطوری از قابلیت‌های جدید و رفع باگ‌ها بهره‌مند می‌شید.

فایل build.gradle.kts (ماژول):

کتابخونه‌های مورد نیاز رو اینجا بذارید:

افزودن hilt به پروژه اندرویدی
plugins {
    ...
    id("com.google.devtools.ksp")
    id("com.google.dagger.hilt.android")
}

dependencies {
       implementation("com.google.dagger:hilt-android:2.56.2")
    ksp("com.google.dagger:hilt-android-compiler:2.56.2")
    implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
    ...
}

قدم دوم: کلاس Application رو بساز

پیداه سازی hilt در کلاس اپلیکیشن پروژه اندرویدی

Hilt برای اینکه از همون اول کار رو شروع کنه، به یه کلاس Application نیاز داره.

  • یه کلاس جدید بسازید که از Application ارث می‌بره.
  • بالای کلاس @HiltAndroidApp رو بذارید.
import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class App : Application() { }
  • بعدش اسم این کلاس رو توی فایل AndroidManifest.xml معرفی کنید.
<application
    android:name=".App"
    ... >
</application>

قدم سوم: Activity رو علامت‌گذاری کن

کافیه بالای MainActivity، انوتیشن @AndroidEntryPoint رو بذارید تا Hilt بدونه که باید وابستگی‌ها رو اینجا تزریق کنه.

Kotlin

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    // ...
}

بزن بریم سراغ Repository Pattern و ViewModel

برای اینکه کدتون حرفه‌ای و تمیز باشه، از الگوی Repository استفاده می‌کنیم.

قدم چهارم: Repository رو بساز

یه کلاس Repository (مثلاً UserRepository) بسازید. این کلاس مسئول ارتباط با دیتابیس Room هست.

Repository in androiv mvvm
class UserRepository @Inject constructor(private val userDao: UserDao) {

    suspend fun getUser(email: String, pass: String): User? {
        return userDao.getUser(email, pass)
    }
}

اینجا userDao به عنوان یک وابستگی با استفاده از @Inject به کلاس تزریق می‌شه.

قدم پنجم: وابستگی‌ها رو به ViewModel تزریق کن

ViewModel مرکز اصلی منطق UI و داده‌هاست.

  • ViewModel رو با انوتیشن @HiltViewModel مشخص کنید.
  • وابستگی مورد نیاز (اینجا UserRepository) رو با @Inject توی کانستراکتورش تزریق کنید.
hilt in viewmodel
@HiltViewModel
class LoginScreenVM @Inject constructor(private val userRepository: userRepository) : ViewModel() {
    // ...
}

اینطوری Hilt خودش یه نمونه از UserRepository می‌سازه و به MyViewModel می‌ده، بدون اینکه شما درگیر جزئیاتش بشین.

ماژول‌های Hilt: راه حل تزریق وابستگی!

Hilt نمی‌دونه چطور باید کلاس‌هایی که از کتابخانه‌های خارجی میان (مثل دیتابیس Room) رو بسازه. اینجا باید ماژول‌ها رو بهش معرفی کنیم.

  • یه object بسازید و بهش @Module و @InstallIn(SingletonComponent::class) بدید.
  • حالا با استفاده از توابع و انوتیشن @Provides به Hilt یاد بدید چطور نمونه‌های مورد نیاز رو بسازه.
پیاده سازی هیلت در پروژه اندرویدی
import android.content.Context
import androidx.room.Room
import com.esfandune.esfadnune_v1.database.AppDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    @Singleton
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "app_database"
        ).build()
    }

    @Provides
    @Singleton
    fun provideUserDao(appDatabase: AppDatabase) = appDatabase.userDAO()
}

نکته اسفندونه: SingletonComponent باعث می‌شه که این وابستگی‌ها توی کل طول عمر برنامه قابل دسترسی باشن که برای آبجکت‌هایی مثل دیتابیس که فقط یه نمونه ازشون لازمه، خیلی عالیه.

قدم ششم: ViewModel رو توی Jetpack Compose استفاده کن

به جای استفاده از viewModel() معمولی، برای ViewModelهای Hilt باید از hiltViewModel() استفاده کنید.

Kotlin

@Composable
fun MyScreen(
    viewModel: MyViewModel = hiltViewModel()
) {
    // ...
}

نتیجه‌گیری

با پیاده‌سازی Hilt، کدنویسی اندرویدتون خیلی حرفه‌ای‌تر و لذت‌بخش‌تر می‌شه. این کتابخونه، کار مدیریت وابستگی‌ها رو براتون آسون می‌کنه و اجازه می‌ده روی منطق اصلی برنامه تمرکز کنید. برای درک بهتر آموزش می تونید ویدیو آموزشیمون رو ببینید.

Comments

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

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