How to use ViewModelProviders in Kotlin
Asked Answered
P

3

13

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)
Piccaninny answered 19/12, 2018 at 8:1 Comment(2)
Please read official Kotlin naming style guide developer.android.com/kotlin/style-guide which says "Special prefixes or suffixes, like those seen in the examples name_, mName, s_name, and kName, are not used except in the case of backing properties (which is prefixed by _)"Greengrocery
@Greengrocery Thanks for the suggestion. Will surely follow this.Piccaninny
H
36

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

Hawks answered 19/12, 2018 at 8:16 Comment(3)
Just to expand this answer, make sure all your arch components dependencies are in the same format. That is: not mixing android.arch and androidx dependencies. Keep in mind that if you want to use the Navigation Component, at the moment of this coment it is only available as an android.arch dependencyScripture
@Mittal Varsani I have edited my question please check and help mePiccaninny
just make your constructor public and try @UmaAchantaHawks
C
5

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)
         ...

     }

}
Calque answered 26/4, 2020 at 5:19 Comment(0)
E
2

Try with below

var mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.java)
Externalism answered 19/12, 2018 at 8:5 Comment(2)
getting error at ViewModelProviders. Its not importingPiccaninny
ViewModelProviders is now deprecated. You should use Mittal's answer in Kotlin.Dissever

© 2022 - 2024 — McMap. All rights reserved.