Created
April 27, 2023 23:06
-
-
Save booknara/352292b64e810acf4f6d08bb787291f2 to your computer and use it in GitHub Desktop.
How to initialize ViewModel with/without arguments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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