Skip to content

Instantly share code, notes, and snippets.

@booknara
Created April 27, 2023 23:06
Show Gist options
  • Save booknara/352292b64e810acf4f6d08bb787291f2 to your computer and use it in GitHub Desktop.
Save booknara/352292b64e810acf4f6d08bb787291f2 to your computer and use it in GitHub Desktop.
How to initialize ViewModel with/without arguments
// Reference: https://dev.to/vtsen/recommended-ways-to-create-viewmodel-or-androidviewmodel-5e7k
// MyViewModel (no argument)
class MyViewModel: ViewModel() {
// Do something
}
// MyAndroidViewModel (Application argument)
class MyAndroidViewModel (app: Application)
: AndroidViewModel(app) {
// Do something
}
// How to initialize ViewModel without arguments
// 1. local variables
val viewModel: MyViewModel = ViewModelProvider(this).get(MyViewModel::class.java)
val androidViewModel: MyAndroidViewModel = ViewModelProvider(this).get(MyAndroidViewModel::class.java)
// 2. lateinit var with ViewModelProvider
// Activity / Fragment variables
private lateinit var viewModel: MyViewModel
private lateinit var androidViewModel: MyAndroidViewModel
// In Activity-onCreate() callback, Fragment-onCreateView callback method
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
androidViewModel = ViewModelProvider(this).get(MyAndroidViewModel::class.java)
}
// 3. by lazy with ViewModelProvider
// Activity / Fragment variables
private val viewModel: MyViewModel by lazy {
ViewModelProvider(this).get(MyViewModel::class.java)
}
private val androidViewModel: MyAndroidViewModel by lazy {
ViewModelProvider(this).get(MyAndroidViewModel::class.java)
}
// 4. by viewModels / activityViewModels (elegant way)
// library dependecy for viewModels() extension function
implementation 'androidx.fragment:fragment-ktx:1.5.5'
private val viewModel: MyViewModel by viewModels()
private val androidViewModel: MyAndroidViewModel by viewModels()
// If you want to share your ViewModel across different fragments within the same activity.
// You can use by activityViewModels.
private val viewModel: MyViewModel by activityViewModels()
private val androidViewModel: MyAndroidViewModel by activityViewModels()
// MyViewModel (custom constructor parameter)
class MyViewModel(private val repository: Repository) : ViewModel() {
// Do something
}
// MyViewModeFactory which has custom constructor parameter
class MyViewModelFactory(private val repository: Repository)
: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
class MyAndroidViewModel(app: Application, repository: Repository) : AndroidViewModel(app) {
// Do something
}
// MyAndroidViewModelFactory which have custom constructor parameters
class MyAndroidViewModelFactory(
private val app: Application,
private val repository: Repository)
: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(
MyAndroidViewModel::class.java)) {
return MyAndroidViewModel(app, repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
// Activity / Fragment variables using by viewModels
private val viewModel: MyViewModel by viewModels {
MyViewModelFactory(Repository())
}
private val androidViewModel: MyAndroidViewModel by viewModels {
MyAndroidViewModelFactory(
requireActivity().application,
Repository())
}
// Activity / Fragment variables using by activityViewModels
private val viewModel: MyAndroidViewModel by activityViewModels {
MyViewModelFactory(Repository())
}
private val androidViewModel: MyAndroidViewModel by activityViewModels {
MyAndroidViewModelFactory(requireActivity().application, Repository())
}
// Activity / Fragment variables using by lazy
private val viewModel: MyViewModel by lazy {
val factory = MyViewModelFactory(Repository())
ViewModelProvider(this, factory).get(MyAndroidViewModel::class.java)
}
private val viewModel: MyAndroidViewModel by lazy {
val factory = MyAndroidViewModelFactory(
requireActivity().application,
Repository())
ViewModelProvider(this, factory).get(MyAndroidViewModel::class.java)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment