I am new bie to Kotlin, Please help me how to use ViewModelProviders.of(this) in Kotlin
My code in java is
mFavViewModel = ViewModelProviders.of(this).get(FavouritesViewModel.class);
I am not able to find ViewModelProviders class in kotlin tried auto convert but its showing errors. Thanks.
Here is my DataModel class
class FavoritesDataViewModel:ViewModel{
private var mFavHelper: DatabaseHelper
private lateinit var mfav:ArrayList<Favorites>
constructor(application: Application) {
mFavHelper = DatabaseHelper(application)
}
fun getListFav():List<Favorites>{
if (mfav==null){
mfav = arrayListOf<Favorites>()
createDummyList()
loadFav()
}
val clonedFavs = arrayListOf<Favorites>()
for (i in 0 until mfav.size) {
clonedFavs.add(Favorites(mfav.get(i)))
}
return clonedFavs
}
fun createDummyList(){
addFav("https://www.journaldev.com", Date().getTime())
addFav("https://www.medium.com", Date().getTime())
addFav("https://www.reddit.com", Date().getTime())
addFav("https://www.github.com", Date().getTime())
addFav("https://www.hackerrank.com", Date().getTime())
addFav("https://www.developers.android.com", Date().getTime())
}
fun addFav(url:String,date:Long):Favorites{
val db:SQLiteDatabase = this.mFavHelper.getWritableDatabase();
val values: ContentValues = ContentValues();
values.put(DbSettings.DbEntry.COL_FAV_DATE,date)
values.put(DbSettings.DbEntry.COL_FAV_URL,url)
val id:Long = db.insertWithOnConflict(DbSettings.DbEntry.TABLE,
null,
values,SQLiteDatabase.CONFLICT_REPLACE)
db.close()
val fav:Favorites = Favorites(id,url,date)
mfav.add(fav)
return Favorites(fav)
}
fun loadFav(){
mfav.clear()
val db:SQLiteDatabase = mFavHelper.readableDatabase
val cursor:Cursor = db.query(DbSettings.DbEntry.TABLE,
arrayOf(
DbSettings.DbEntry._ID,
DbSettings.DbEntry.COL_FAV_URL,
DbSettings.DbEntry.COL_FAV_DATE
),
null, null, null, null, null);
while (cursor.moveToNext()){
val idxID:Int = cursor.getColumnIndex(DbSettings.DbEntry._ID)
val idxURL:Int = cursor.getColumnIndex(DbSettings.DbEntry.COL_FAV_URL)
val idxDate:Int = cursor.getColumnIndex(DbSettings.DbEntry.COL_FAV_DATE)
mfav.add(Favorites(cursor.getLong(idxID),cursor.getString(idxURL),cursor.getLong(idxDate)))
}
cursor.close()
db.close()
}
}
tried with following line of code
var mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.java)
implementation 'android.arch.lifecycle:extensions:1.1.1'
this is giving error:
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.nearex.mykotlinsample.viewmodel.FavoritesDataViewModel
at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:153)
at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:210)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
at com.nearex.mykotlinsample.view.MainActivity.onCreate(MainActivity.kt:29)
Kotlin |Java. open class ViewModelProvider. An utility class that provides ViewModels for a scope. Default ViewModelProvider for an Activity or a Fragment can be obtained by passing it to the constructor: ViewModelProvider(myFragment)
If your ViewModel has dependencies or arguments and you want to create your ViewModel instance, then you should create your custom ViewModelProvider. Factory and pass the dependency or arguments through the ViewModel constructor and give a value to the ViewModelProvider. Factory instance.
Kotlin supports delegation of design pattern by introducing a new keyword "by". Using this keyword or delegation methodology, Kotlin allows the derived class to access all the implemented public methods of an interface through a specific object.
This method is deprecated. More detailed explanation is in ViewModel . It uses the default factory to instantiate new ViewModels.
For Java
For pre-AndroidX
implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation "android.arch.lifecycle:viewmodel:1.1.0"
For AndroidX
implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0"
In the latest version, ViewModel can be declared as below
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
For Kotlin
For pre-AndroidX
implementation 'android.arch.lifecycle:extensions-ktx:1.1.1'
implementation "android.arch.lifecycle:viewmodel-ktx:1.1.1"
For Android
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
ViewModel declaration
val model = ViewModelProvider(activity)[MyViewModel::class.java]
Refer below link for the latest AndroidX dependency version
Note: For pre-AndroidX, the dependency version will not be updated
Its assumed kotlin is in use - Class ViewModelProviders has been deprecated, instead ViewModelProvider can be used. To use this need to add a dependency in app build.gradle something like this -
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
Create a view model class -
class MyViewModel: ViewModel(){
}
The same class object can be find from fragment - onCreateView. For example -
class MyFragment: Fragment(){
...
private lateint var myViewModel: MyViewModel
...
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
myViewModel = ViewModelProvider(this).get(MyViewModel::class.java)
...
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With