Skip to content

Instantly share code, notes, and snippets.

@senamit2708
Created July 5, 2023 07:05
Show Gist options
  • Select an option

  • Save senamit2708/d532fbd8232adea7c2d15f0e3106380d to your computer and use it in GitHub Desktop.

Select an option

Save senamit2708/d532fbd8232adea7c2d15f0e3106380d to your computer and use it in GitHub Desktop.
Viewmodel definition
//viewmodel ktx-> used for defining viewmodel using "by activityViewModel()"
implementation 'androidx.fragment:fragment-ktx:1.6.0'
package com.example.coroutinelearning.viewModels.learning
import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.coroutinelearning.repositories.MyRepositoryTwo
import java.lang.IllegalArgumentException
class MyAndroidViewModelFactoryFour(
private val application: Application,
private val repository: MyRepositoryTwo
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyAndroidViewModelFour::class.java)) {
return MyAndroidViewModelFour(application, repository) as T
}
if (modelClass.isAssignableFrom(MyAndroidViewModelFive::class.java)) {
return MyAndroidViewModelFive(application, repository) as T
}
throw IllegalArgumentException("unknown viewmodel class")
}
}
package com.example.coroutinelearning.viewModels.learning
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import com.example.coroutinelearning.repositories.MyRepositoryTwo
class MyAndroidViewModelFour(application: Application, repository: MyRepositoryTwo) :
AndroidViewModel(application) {
private val viewModelClassName = MyAndroidViewModelFour::class.simpleName
fun getClassName(): String {
return viewModelClassName ?: "not found"
}
}
package com.example.coroutinelearning.viewModels.learning
import android.app.Application
import androidx.lifecycle.AndroidViewModel
class MyAndroidViewModelOne(application: Application) : AndroidViewModel(application) {
private val viewModelClassName = MyAndroidViewModelOne::class.simpleName
fun getClassName(): String {
return viewModelClassName ?: "not found"
}
}
package com.example.coroutinelearning.viewModels.learning
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
import androidx.lifecycle.viewmodel.CreationExtras
import com.example.coroutinelearning.repositories.MyRepositoryOne
class MyAndroidViewModelSix(application: Application, repository: MyRepositoryOne) :
AndroidViewModel(application) {
private val className = MyAndroidViewModelSix::class.simpleName
fun getClassName(): String {
return className ?: "not found"
}
//define viewmodel factory in a companion object
companion object {
val factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
val application = checkNotNull(extras[APPLICATION_KEY])
val repository = MyRepositoryOne(application)
return MyAndroidViewModelSix(
application, repository
) as T
}
}
}
}
package com.example.coroutinelearning.viewModels.learning
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.coroutinelearning.repositories.MyRepositoryTwo
import java.lang.IllegalArgumentException
class MyViewModelFactoryFour(private val repository: MyRepositoryTwo) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModelFour::class.java)) {
return MyViewModelFour(repository) as T
}
if (modelClass.isAssignableFrom(MyViewModelFive::class.java)) {
return MyViewModelFive(repository) as T
}
throw IllegalArgumentException("no such viewmodel found")
}
}
package com.example.coroutinelearning.viewModels.learning
import androidx.lifecycle.ViewModel
import com.example.coroutinelearning.repositories.MyRepositoryTwo
class MyViewModelFour(repository: MyRepositoryTwo) : ViewModel() {
private val viewModelClassName = MyViewModelFour::class.simpleName
fun getClassName(): String {
return viewModelClassName ?: "not found"
}
}
package com.example.coroutinelearning.viewModels.learning
import androidx.lifecycle.ViewModel
class MyViewModelOne : ViewModel() {
private val viewModelClassName = MyViewModelOne::class.simpleName
fun getClassName(): String {
return viewModelClassName ?: "not found"
}
}
package com.example.coroutinelearning.fragments
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.ViewModelProvider
import com.example.coroutinelearning.databinding.ViewmodelDefinintionBinding
import com.example.coroutinelearning.repositories.MyRepositoryTwo
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelFactoryFour
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelFive
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelFour
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelOne
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelSix
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelThree
import com.example.coroutinelearning.viewModels.learning.MyAndroidViewModelTwo
import com.example.coroutinelearning.viewModels.learning.MyViewModelFactoryFour
import com.example.coroutinelearning.viewModels.learning.MyViewModelFive
import com.example.coroutinelearning.viewModels.learning.MyViewModelFour
import com.example.coroutinelearning.viewModels.learning.MyViewModelOne
import com.example.coroutinelearning.viewModels.learning.MyViewModelThree
import com.example.coroutinelearning.viewModels.learning.MyViewModelTwo
class ViewModelDefinitionFragment : Fragment() {
private val TAG = ViewModelDefinitionFragment::class.simpleName
private lateinit var binding: ViewmodelDefinintionBinding
private lateinit var myViewModelOne: MyViewModelOne
private lateinit var myAndroidViewModelOne: MyAndroidViewModelOne
private val myViewModelTwo: MyViewModelTwo by lazy {
ViewModelProvider(requireActivity())[MyViewModelTwo::class.java]
}
private val myAndroidViewModelTwo: MyAndroidViewModelTwo by lazy {
ViewModelProvider(requireActivity())[MyAndroidViewModelTwo::class.java]
}
private val myViewModelThree: MyViewModelThree by activityViewModels()
private val myAndroidViewModelThree: MyAndroidViewModelThree by activityViewModels()
private val myViewModelFour: MyViewModelFour by activityViewModels {
MyViewModelFactoryFour(MyRepositoryTwo())
}
private val myAndroidViewModelFour: MyAndroidViewModelFour by activityViewModels {
MyAndroidViewModelFactoryFour(requireActivity().application, MyRepositoryTwo())
}
private val myViewModelFive: MyViewModelFive by lazy {
val factory = MyViewModelFactoryFour(MyRepositoryTwo())
ViewModelProvider(this, factory).get(MyViewModelFive::class.java)
}
private val myAndroidViewModelFive: MyAndroidViewModelFive by lazy {
val factory =
MyAndroidViewModelFactoryFour(requireActivity().application, MyRepositoryTwo())
ViewModelProvider(this, factory).get(MyAndroidViewModelFive::class.java)
}
private val myAndroidViewModelSix: MyAndroidViewModelSix by activityViewModels { MyAndroidViewModelSix.factory }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
binding = ViewmodelDefinintionBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModelLateintInitialize()
loadDataViewModelLateint()
loadDataViewModelByLazy()
loadDataViewModelByKTX()
loadDataViewModelFactoryByKTX()
loadDataViewModelFactoryByLazy()
loadDataViewModelFactoryObject()
}
private fun viewModelLateintInitialize() {
myViewModelOne = ViewModelProvider(requireActivity())[MyViewModelOne::class.java]
myAndroidViewModelOne =
ViewModelProvider(requireActivity())[MyAndroidViewModelOne::class.java]
}
private fun loadDataViewModelLateint() {
val myViewModelOneName = myViewModelOne.getClassName()
val myAndroidViewModelOneName = myAndroidViewModelOne.getClassName()
Log.i(TAG, "myViewModelOne name: $myViewModelOneName")
Log.i(TAG, "myAndroidViewModelOne name: $myAndroidViewModelOneName")
}
private fun loadDataViewModelByLazy() {
val myViewModelTwoName = myViewModelTwo.getClassName()
val myAndroidViewModelTwoName = myAndroidViewModelTwo.getClassName()
Log.i(TAG, "myViewModelTwo name: $myViewModelTwoName")
Log.i(TAG, "myAndroidViewModelTwo name: $myAndroidViewModelTwoName")
}
private fun loadDataViewModelByKTX() {
val myViewModelThreeName = myViewModelThree.getClassName()
val myAndroidViewModelThreeName = myAndroidViewModelThree.getClassName()
Log.i(TAG, "myViewModelThree name: $myViewModelThreeName")
Log.i(TAG, "myAndroidViewModelThree name: $myAndroidViewModelThreeName")
}
private fun loadDataViewModelFactoryByLazy() {
val myViewModelFourName = myViewModelFour.getClassName()
val myAndroidViewModelFourName = myAndroidViewModelFour.getClassName()
Log.i(TAG, "myViewModelFour name: $myViewModelFourName")
Log.i(TAG, "myAndroidViewModelFour name: $myAndroidViewModelFourName")
}
private fun loadDataViewModelFactoryByKTX() {
val myViewModelFiveName = myViewModelFive.getClassName()
val myAndroidViewModelFiveName = myAndroidViewModelFive.getClassName()
Log.i(TAG, "myViewModelFive name: $myViewModelFiveName")
Log.i(TAG, "myAndroidViewModelFive name: $myAndroidViewModelFiveName")
}
private fun loadDataViewModelFactoryObject() {
val myAndroidViewModelSixName = myAndroidViewModelSix.getClassName()
Log.i(TAG, "myAndroidViewModelSix name: $myAndroidViewModelSixName")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment