Skip to content

Instantly share code, notes, and snippets.

@tateisu
Created October 15, 2021 08:29
Show Gist options
  • Save tateisu/1d33f016f5d498233fb94361c2f62080 to your computer and use it in GitHub Desktop.
Save tateisu/1d33f016f5d498233fb94361c2f62080 to your computer and use it in GitHub Desktop.
// ViewModelのfactoryを毎回書くのが面倒
fun <T : ViewModel> viewModelFactory(creator: () -> T) =
object : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val viewModel = creator()
if (!modelClass.isAssignableFrom(viewModel::class.java)) {
error("unexpected modelClass. ${modelClass.simpleName}")
}
return viewModel as T
}
}
// ViewModelProvider.get を毎回書くのが面倒
inline fun <reified T : ViewModel> provideViewModel(owner: ViewModelStoreOwner, noinline creator:()->T)=
ViewModelProvider(owner, viewModelFactory(creator)).get(T::class.java)
// 使用例
class AccountSelectActivity : AppCompatActivity() {
...
private val viewModel by lazy {
provideViewModel(this){ AccountSwitchDialogViewModel(AccountSwitchRepositoryImpl()) }
}
...
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment