facebook twitter hatena line email

「Android/kotlin/DaggerHilt」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
行63: 行63:
 
         setContentView(R.layout.activity_main)
 
         setContentView(R.layout.activity_main)
  
 +
        Log.v("MainActivity", "onCreate!!")
 +
        usecase.print("MainActivity", "usecase.print!!")
 
     }
 
     }
 
}
 
}
行96: 行98:
 
     @Provides
 
     @Provides
 
     fun provideHogeUseCase(hogeService: HogeService) : HogeUsecase {
 
     fun provideHogeUseCase(hogeService: HogeService) : HogeUsecase {
 +
        Log.v("ApplicationProvides", "provideHogeUseCase!!")
 
         return HogeUsecase(hogeService)
 
         return HogeUsecase(hogeService)
 
     }
 
     }
行111: 行114:
 
class HogeServiceImpl @Inject constructor(): HogeService {
 
class HogeServiceImpl @Inject constructor(): HogeService {
 
     override fun print(tag: String, message: String) {
 
     override fun print(tag: String, message: String) {
         Log.v(tag, message)
+
         Log.v("HogeServiceImpl", "print!! tag=$tag message=$message")
 
     }
 
     }
 
}
 
}
行122: 行125:
 
class HogeUsecase @Inject constructor(private val service: HogeService) {
 
class HogeUsecase @Inject constructor(private val service: HogeService) {
 
     fun print(tag: String, message: String) {
 
     fun print(tag: String, message: String) {
 +
        Log.v("HogeUsecase", "print!! tag=$tag message=$message")
 
         service.print(tag, message)
 
         service.print(tag, message)
 
     }
 
     }
行127: 行131:
 
</pre>
 
</pre>
  
 +
出力
 +
<pre>
 +
V/ApplicationProvides: provideHogeUseCase!!
 +
V/MainActivity: onCreate!!
 +
V/HogeUsecase: print!! tag=MainActivity message=usecase.print!!
 +
V/HogeServiceImpl: print!! tag=MainActivity message=usecase.print!!
 +
</pre>
 
==参考==
 
==参考==
 
https://medium.com/kaleidot725/%E8%A9%B1%E9%A1%8C%E3%81%AE-dagger-hilt-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-13acab8163e0
 
https://medium.com/kaleidot725/%E8%A9%B1%E9%A1%8C%E3%81%AE-dagger-hilt-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-13acab8163e0

2021年2月12日 (金) 21:26時点における版

サンプル

プロジェクト直の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!!

参考

https://medium.com/kaleidot725/%E8%A9%B1%E9%A1%8C%E3%81%AE-dagger-hilt-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-13acab8163e0