Android/kotlin/DaggerHilt/基本
提供: 初心者エンジニアの簡易メモ
2021年3月31日 (水) 15:06時点におけるAdmin (トーク | 投稿記録)による版 (ページの作成:「==サンプル== プロジェクト直のbuild.gradleに以下追加 <pre> buildscript { dependencies { classpath "com.android.tools.build:gradle:4.1.1"...」)
サンプル
プロジェクト直のbuild.gradleに以下追加
buildscript {
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
def dagger_hilt_version = "2.31-alpha"
classpath "com.google.dagger:hilt-android-gradle-plugin:${dagger_hilt_version}"
}
}
app/build.gradleに以下追加
plugins {
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
dependencies {
def dagger_hilt_version = "2.31.2-alpha"
implementation "com.google.dagger:hilt-android:${dagger_hilt_version}"
kapt "com.google.dagger:hilt-android-compiler:${dagger_hilt_version}"
def dagger_hilt_view_model_version = "1.0.0-alpha03"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:${dagger_hilt_view_model_version}"
kapt "androidx.hilt:hilt-compiler:${dagger_hilt_view_model_version}"
}
applicationを追加
MainApplication.kt
import android.app.Application import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class MainApplication : Application()
AndoridManifest.xml のandroid:nameにpathを追加
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.daggerhiltapplication">
<application
android:name="com.example.daggerhiltapplication.MainApplication"
MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var usecase: HogeUsecase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.v("MainActivity", "onCreate!!")
usecase.print("MainActivity", "usecase.print!!")
}
}
サービスとユースケースの読み込みモジュール
ApplicationBindsModule.kt
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
abstract class ApplicationBindsModule {
@Binds
abstract fun bindHogeService(hogeServiceImpl: HogeServiceImpl) : HogeService
}
ApplicationProvidesModule.kt
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
object ApplicationProvidesModule {
@Provides
fun provideHogeUseCase(hogeService: HogeService) : HogeUsecase {
Log.v("ApplicationProvides", "provideHogeUseCase!!")
return HogeUsecase(hogeService)
}
}
HogeService.kt
import android.util.Log
import javax.inject.Inject
interface HogeService {
fun print(tag: String, message: String)
}
class HogeServiceImpl @Inject constructor(): HogeService {
override fun print(tag: String, message: String) {
Log.v("HogeServiceImpl", "print!! tag=$tag message=$message")
}
}
HogeUsecase.kt
import javax.inject.Inject
class HogeUsecase @Inject constructor(private val service: HogeService) {
fun print(tag: String, message: String) {
Log.v("HogeUsecase", "print!! tag=$tag message=$message")
service.print(tag, message)
}
}
出力
V/ApplicationProvides: provideHogeUseCase!! V/MainActivity: onCreate!! V/HogeUsecase: print!! tag=MainActivity message=usecase.print!! V/HogeServiceImpl: print!! tag=MainActivity message=usecase.print!!
MainViewModelを追加
app/build.gradle
dependencies {
implementation "androidx.activity:activity-ktx:1.1.0"
}
MainViewModel.kt
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class MainViewModel @Inject constructor(
private val savedState: SavedStateHandle,
private val usecase: HogeUsecase
): ViewModel() {
fun print() {
usecase.print("MainViewModel", "print!!")
}
}
MainActivity.ktを改修
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.activity.viewModels
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var usecase: HogeUsecase
private val mainViewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.v("MainActivity", "onCreate!!")
usecase.print("MainActivity", "usecase.print!!")
mainViewModel.print()
}
}
出力
V/ApplicationProvides: provideHogeUseCase!! V/MainActivity: onCreate!! V/HogeUsecase: print!! tag=MainActivity message=usecase.print!! V/HogeServiceImpl: print!! tag=MainActivity message=usecase.print!! V/ApplicationProvides: provideHogeUseCase!! V/HogeUsecase: print!! tag=MainViewModel message=print!! V/HogeServiceImpl: print!! tag=MainViewModel message=print!!
