facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(ページの作成:「==dagger2とは== Google製のDIライブラリ ==サンプル== app/build.gradle <pre> apply plugin: 'kotlin-kapt' dependencies { implementation "com.google....」)
 
(Admin がページ「Android/kotlin/dagger2」を「Android/kotlin/Dagger2」に、リダイレクトを残さずに移動しました)
 
(同じ利用者による、間の9版が非表示)
行3: 行3:
  
 
==サンプル==
 
==サンプル==
 +
dagger2を使って、例として、50歳までの年数を取得する方法
 +
 
app/build.gradle
 
app/build.gradle
  
行9: 行11:
  
 
dependencies {
 
dependencies {
     implementation     "com.google.dagger:dagger:2.14.1"
+
    def dagger_version = 2.27
     annotationProcessor "com.google.dagger:dagger-compiler:2.14.1"
+
     implementation "com.google.dagger:dagger:$dagger_version"
     kapt               "com.google.dagger:dagger-compiler:2.14.1"
+
     annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
     kaptTest           "com.google.dagger:dagger-compiler:2.14.1"
+
     kapt "com.google.dagger:dagger-compiler:$dagger_version"
 +
     kaptTest "com.google.dagger:dagger-compiler:$dagger_version"
 
}
 
}
 
</pre>
 
</pre>
  
 +
MainActivity.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
import androidx.appcompat.app.AppCompatActivity
 +
import android.os.Bundle
 +
import android.util.Log
 +
import javax.inject.Inject
 +
 +
class MainActivity : AppCompatActivity() {
 +
    @Inject
 +
    lateinit var viewModel: MainViewModel
 +
 +
    private val component = DaggerMainActivityComponent.builder()
 +
            .viewModelModule(ViewModelModule())
 +
            .repositoryModule(RepositoryModule())
 +
            .build()
 +
 +
    override fun onCreate(savedInstanceState: Bundle?) {
 +
        super.onCreate(savedInstanceState)
 +
        setContentView(R.layout.activity_main)
 +
 +
        component.inject(this)
 +
 +
        viewModel.defaultAge()
 +
        Log.i("MainActivity", "diff50Age=" + viewModel.getDiff50Age())
 +
    }
 +
}
 +
</pre>
 +
 +
MainActivityComponent.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
import dagger.Component
 +
 +
@Component(modules = [ViewModelModule::class, RepositoryModule::class])
 +
interface MainActivityComponent {
 +
    fun inject(activity: MainActivity)
 +
}
 +
</pre>
 +
 +
MainViewModel.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
import javax.inject.Inject
 +
 +
class MainViewModel @Inject constructor(private val userRepository: IUserRepository) {
 +
    fun defaultAge() {
 +
        userRepository.age = 12;
 +
    }
 +
    fun getDiff50Age(): Int {
 +
        return userRepository.getDiff50Age()
 +
    }
 +
}
 +
</pre>
 +
 +
RepositoryModule.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
import dagger.Module
 +
import dagger.Provides
 +
 +
@Module
 +
class RepositoryModule {
 +
    @Provides
 +
    fun provideUserRepository(): IUserRepository {
 +
        return UserRepository()
 +
    }
 +
}
 +
</pre>
 +
 +
UserRepository.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
class UserRepository : IUserRepository {
 +
    override var age: Int = 0
 +
    override fun getDiff50Age(): Int {
 +
        return 50 - age
 +
    }
 +
}
 +
</pre>
 +
 +
IUserRepository.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
interface IUserRepository {
 +
    fun age(): Int
 +
}
 +
</pre>
 +
 +
ViewModelModule.kt
 +
<pre>
 +
package com.example.daggerapplication
 +
 +
import dagger.Module
 +
import dagger.Provides
 +
 +
@Module
 +
class ViewModelModule {
 +
    @Provides
 +
    fun provideMainViewModel(userRepository: IUserRepository): MainViewModel {
 +
        return MainViewModel(userRepository)
 +
    }
 +
}
 +
</pre>
 +
 +
===上記サンプルの説明===
 +
ViewModelModuleは各種ViewModelを一覧で登録するもの。
 +
RepositoryModuleは各種Repositoryを一覧で登録するもの。
 +
アプリなどによって、UserRepositoryとMainViewModelに必要なコードを記述してく。
 +
 +
==参考==
 +
https://qiita.com/sudachi808/items/a05237e1294639ea41dd
  
参考:https://qiita.com/sudachi808/items/a05237e1294639ea41dd
+
https://qiita.com/iTakahiro/items/c9203f5ad886b7ddae2f

2021年2月9日 (火) 04:02時点における最新版

dagger2とは

Google製のDIライブラリ

サンプル

dagger2を使って、例として、50歳までの年数を取得する方法

app/build.gradle

apply plugin: 'kotlin-kapt'

dependencies {
    def dagger_version = 2.27
    implementation "com.google.dagger:dagger:$dagger_version"
    annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"
    kaptTest "com.google.dagger:dagger-compiler:$dagger_version"
}

MainActivity.kt

package com.example.daggerapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import javax.inject.Inject

class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var viewModel: MainViewModel

    private val component = DaggerMainActivityComponent.builder()
            .viewModelModule(ViewModelModule())
            .repositoryModule(RepositoryModule())
            .build()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        component.inject(this)

        viewModel.defaultAge()
        Log.i("MainActivity", "diff50Age=" + viewModel.getDiff50Age())
    }
}

MainActivityComponent.kt

package com.example.daggerapplication

import dagger.Component

@Component(modules = [ViewModelModule::class, RepositoryModule::class])
interface MainActivityComponent {
    fun inject(activity: MainActivity)
}

MainViewModel.kt

package com.example.daggerapplication

import javax.inject.Inject

class MainViewModel @Inject constructor(private val userRepository: IUserRepository) {
    fun defaultAge() {
        userRepository.age = 12;
    }
    fun getDiff50Age(): Int {
        return userRepository.getDiff50Age()
    }
}

RepositoryModule.kt

package com.example.daggerapplication

import dagger.Module
import dagger.Provides

@Module
class RepositoryModule {
    @Provides
    fun provideUserRepository(): IUserRepository {
        return UserRepository()
    }
}

UserRepository.kt

package com.example.daggerapplication

class UserRepository : IUserRepository {
    override var age: Int = 0
    override fun getDiff50Age(): Int {
        return 50 - age
    }
}

IUserRepository.kt

package com.example.daggerapplication

interface IUserRepository {
    fun age(): Int
}

ViewModelModule.kt

package com.example.daggerapplication

import dagger.Module
import dagger.Provides

@Module
class ViewModelModule {
    @Provides
    fun provideMainViewModel(userRepository: IUserRepository): MainViewModel {
        return MainViewModel(userRepository)
    }
}

上記サンプルの説明

ViewModelModuleは各種ViewModelを一覧で登録するもの。 RepositoryModuleは各種Repositoryを一覧で登録するもの。 アプリなどによって、UserRepositoryとMainViewModelに必要なコードを記述してく。

参考

https://qiita.com/sudachi808/items/a05237e1294639ea41dd

https://qiita.com/iTakahiro/items/c9203f5ad886b7ddae2f