Android (Compose)/Library

[Android] Hilt 간단 적용

찌김이 2022. 8. 1. 23:25
728x90
반응형

Hilt 는 Google 에서 오피셜로 발표한 안드로이드 DI 라이브러리 입니다. 

Dagger2 기반의 DI 라이브러리이며 모든 Android  클래스에 컨테이너를 제공하고 수명주기를 자동으로 관리함으로써 애플리케이션에서 DI 를 사용하는 표준을 제공합니다.

이번 포스팅에서 간단하게 구현할 수 있는 방법을 소개합니다.

 

build.gradle (Module)

plugins {
    .
    .
    .
    
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
    
}

dependencies {
    .
    .
    .
    
    implementation "com.google.dagger:hilt-android:$hilt_version"
    kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
    implementation "androidx.hilt:hilt-compiler:$hilt_compiler_version"
    implementation "androidx.hilt:hilt-navigation-compose:$hilt_nav_compose_version"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_view_model_version"
}

 

build.gradle (Project)

buildscript {
    ext {
    	.
        .
        .

        hilt_version = '2.38.1'
        hilt_android_compiler_version = '2.37'
        hilt_view_model_version = '1.0.0-alpha03'
        hilt_compiler_version = '1.0.0'
        hilt_nav_compose_version = '1.0.0'
    }
}

 

settings.gradle

pluginManagement {
    .
    .
    .
    
    resolutionStrategy {
        eachPlugin {
            if( requested.id.id == 'dagger.hilt.android.plugin') {
                useModule("com.google.dagger:hilt-android-gradle-plugin:2.38.1")
            }
        }
    }
}

 

SampleApplication.kt

  • Application 을 상속 받는 클래스를 만들어주고 @HiltAndroidApp 어노테이션을 붙여줍니다.
import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class SampleApplication : Application()

 

AndroidManifest.xml

  • application 태그 내부에 android:name=".SampleApplication" 을 넣어줍니다. 
<?xml version="1.0" encoding="utf-8"?>
<manifest 
    .
    .
    
    <application
        // 추가
        android:name=".SampleApplication"
        .
        .
        .
        >
        <activity
            android:name=".MainActivity"
            .
            .
            .
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

MainActivity.kt

  • 사용할 화면에  @AndroidEntryPoint 어노테이션을 적어줍니다.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Hilt_sampleTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    SampleScreen()
                }
            }
        }
    }
}

 

SampleModule.kt

  • Retrofit 이나 Room  같은 라이브러리들은 Provide를 이용해서 DI 를 제공할 수 있습니다.
  • object 클래스에는 @Module @InstallIn(SingletonComponent::class) 어노테이션을 적어줍니다.
  • @Provides @Singleton 으로 제공할 클래스를 넣습니다.
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

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

    @Provides
    @Singleton
    fun provideSampleService() = SampleService()

}

 

SampleViewModel.kt

  • Hilt 를 적용할 ViewModel  클래스에 @HiltViewModel @Inject 어노테이션을 적어줍니다.
  • 그리고 constructor 내부에 DI 에 올린 클래스를 넣어주면 끝
@HiltViewModel
class SampleViewModel @Inject constructor(
    private val service: SampleService
) : ViewModel() {
    .
    .
    .

}

 

SampleScreen.kt

  • 화면에서 ViewModel 주입은  = hiltViewModel() 으로 할 수 있습니다.
@Composable
fun SampleScreen(
    viewModel: SampleViewModel = hiltViewModel()
) {
    .
    .
    .
    
}

 

  • 샘플코드 첨부합니다.

hilt_sample.zip
0.46MB

 

728x90
반응형