出会って即注入!〜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