出会って即注入!〜Koinのsingleを一瞬でインスタンス生成する裏技に専門家も驚きを隠せない!?〜

男には泣いていい瞬間が3つある

ひとつ目は 生まれたとき

ふたつ目は 大切な人を失ったとき

みっつ目はTokyo 7th シスターズ
EPISODE.1.0-001、Episode.KARAKURI、EPISODE.3.0-014、EPISODE.4.0 AXiS 12話、13話を見たとき、Koinでsingle { Hoge() }したクラスをlazyではなくApplicationのonCreate()インスタンス生成したくてstartKoinの次の行でgetKoin().get<Hoge>()したらアプリが起動した直後にクラッシュしたときである。*1

解決

single { Hoge() }single(createOnStart = true){ Hoge() }にするとHogeインスタンスstartKoinで生成されます。*2

〜めでたしめでたし〜

おまけ

なんでこんなことしたかったのか
FluxのStoreやActionCreatorをKoinでsingleにしてるのですが、その中でStoreがinit()の中でDispatcherに自身を登録しています。

KoinのsingleはApplicationに直にインスタンスを持っているのとは少し勝手が違い、一度生成されたインスタンスを保持してくれるだけです。その肝心の生成の処理はby injectを書いたところでby lazyで行われるので、何も指定しなければ「初めてインスタンスを使おうとした時にインスタンスが作られ、そのインスタンスが保持される」がKoinのsingleです。

そんな状態だと、StoreがKoinのlazy(by inject)で初期化される前に飛んできたActionの情報を保存することができないので、できればApplication起動時にStoreのinit()を呼んでおきたかったのです。

どうやらmoduleもmodule(createOnStart = true) { /*いろいろ*/ }できるそうですが試してないので詳しいことはわかりません。

*1:ナナシスのエピソード、沁みてホロリときたり微笑んで終わるようなものが多くて、思ってたよりガチ泣きエピソードが少なかった。

*2:https://insert-koin.io/docs/2.0/documentation/reference/index.html#_create_instances_at_start