アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

koinでSavedStateHandleを使用する。

結論

module {
    viewModel { (savedState : SavedStateHandle) -> 
        StateViewModel(savedState)
    }
}

class StateViewModel(savedState : SavedStateHandle) : ViewModel {

}

val viewModel by viewModel<StateViewModel> { parametersOf(Bundle) }

parametersOfでBundleを渡すとSavedStateに変換されて渡ってくる。

コードを追う

このPRで機能が追加されました。
https://github.com/InsertKoinIO/koin/pull/496

最初は以下のようにuseState というものが有ったのだが、

viewModel(useState = true){ (handle: SavedStateHandle) ->
        StateViewModel(savedState)
}

2.1.0-alpha-8でwipというコミットで無くても良くなった。コード自体は追いやすいけど変更理由は謎。 https://github.com/InsertKoinIO/koin/commit/1e98608ec0a66183e14949cb8170be65e6aa11ae#diff-bf3b88c8af3824a062abbbd0e074ec87

と思ったらissuesに書いてあった。
https://github.com/InsertKoinIO/koin/issues/648

parametesOfでBundleを渡す方法はPRで一応検討はされていて、 https://github.com/InsertKoinIO/koin/pull/496#issuecomment-516514382

普通にBundle渡したい時ややこしくねという感じでdefaultArgumentsという引数に渡すことになりました。

val viewModel by viewModel<StateViewModel>(defaultArguments = { Bundle() }) {}

parametersOfに置くのは綺麗ではないと言っているのですがね。 https://github.com/InsertKoinIO/koin/pull/496#issuecomment-522904466

Bundleが強制的にSavedStateHandleに書き換えられるので、Bundleを渡すことは自分では無いですが第2引数以降に含めるしか方法はなくなりました。
一応意図した動作なのかを質問しました。