Help us understand the problem. What is going on with this article?

Koin2.0でお手軽DI(Android)

この記事ではAndroidでのKoinの使い方を扱います。

Koinとは

KoinとはKotlin用のDependency injection Framework (依存性注入フレームワーク)です。

AndroidでDI FrameworkといえばDaggerやKodeinなどもありますが、Koinは
- Kotlin100%で書かれていること
- シンプルな使い方
が特徴です。

めっちゃシンプルです。
AAC ViewModelが秒でInjectionできます。
簡単すぎる!!!!!!!!!!!!!!!!幸せ❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣ ってなる。

この記事ではバージョン2.0.1を用いています。

DIとは

DIとはDependency injectionの略で日本語で依存性注入と言います。
詳しくは、こちらの記事 (猿でも分かる! Dependency Injection: 依存性の注入)
などがわかりやすく解説してくれてるので見てください。

実際に使う

物は試し、まずは触ってみましょう。

アプリに導入する

以下をbuild.gradle(app)dependenciesに追加してください。

build.gradle(app)
def koin_version = "2.0.1"
implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-core-ext:$koin_version"
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-android-scope:$koin_version"
implementation "org.koin:koin-android-viewmodel:$koin_version"
implementation "org.koin:koin-android-ext:$koin_version"

syncして完了です。

実装

今回はViewModeに依存するFragmentを例に進めていきます。

class MainFragment : Fragment() {
    // ここにViewModelを持ちたい。
}

class MainViewModel : ViewModel() {
    /* functions */
}

moduleを用意し、koinをスタートさせる 

Applicationクラスを継承したクラスで、
injectしたいクラスらを記述したmoduleを用意しstartKoinメソッドを呼ぶとKoinをスタートさせることができます。
moduleにinjectしたいクラスを記述する際には、

Singletonにしたい場合 single{}
AAC ViewModelを使う場合 viewModel{}
その他 factory{}

今回はAAC ViewModelをinjectするので、viewModel{}を用います。

App.kt
class App : Application() {
    override fun onCreate() {
        startKoin{
            androidContext(applicationContext)
            modules(module)
        }
    }

    val module = module {
        viewModel { MainViewModel()}
    }
}

injectする

あとはinjectしたい場所でinjectするだけです。

変数に対してby inject()をしてあげることでinjectすることができます。
ViewModelをinjectする際はby viewModel()を用います。

今回は、例に沿ってMainFragmentMainViewModelをinjectします。
ですのでby viewModel()を用います。

MainFragment.kt
class MainFragment : Fragment() {

    val viewModel by ViewModel()

    //...
}

これでinjectできました!!!!!!!!!!!!!!!!!!!!!!!!
簡単すぎる!!!!!!!!!!!!!!!!幸せ❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣

ViewModelがRepositoryを持つ場合

MainViewModelが引数にRepositoryを持つ場合も試してみましょう。

class Repository(){
   //get~~() etc...
}

class MainViewModel(val repository : Repository) {
    //...
}

まず、先程のApp.ktmoduleの中に引数にinjectしたいRepositoryを記述します。
今回RepositoryはSingletonであってほしいので、single{}メソッドを用います。

引数にinjectするにはget()メソッドを呼ぶと勝手に必要なものを引数にinjectしてくれます。

App.kt
class App : Application() {
    override fun onCreate() {
        startKoin{
            androidContext(applicationContext)
            modules(module)
        }
    }

    val module = module {
        single { Repository()}
        viewModel { MainViewModel(get())} // add
    }
}

簡単すぎる!!!!!!!!!!!!!!!!幸せ❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣

まとめ

少ない記述で済ませられるので、小規模なアプリこそKoinを用いるのが良いと思います。
Koin使うと幸せ❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣❣ って感じですね!!!!!

間違い等ありましたらコメント下さい...申し訳ありません

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした