web-dev-qa-db-fra.com

Comment utiliser ViewModelProviders dans Kotlin

Je suis un nouveau joueur de Kotlin, veuillez m'aider à utiliser ViewModelProviders.of (this) dans Kotlin

Mon code en Java is

 mFavViewModel = ViewModelProviders.of(this).get(FavouritesViewModel.class);

Je ne suis pas en mesure de trouver ViewModelProviders classe dans kotlin a essayé la conversion automatique, mais ses erreurs sont affichées. Merci.

Voici ma classe DataModel

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()
    }

}

essayé avec la ligne de code suivante

var mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.Java)
implementation 'Android.Arch.lifecycle:extensions:1.1.1'

cela donne une erreur:

  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)
6
Uma Achanta

Dans Kotlin, vous pouvez écrire comme ci-dessous

val mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.Java)

Assurez-vous d'avoir ajouté la dépendance ci-dessous dans Gradle

implementation 'Android.Arch.lifecycle:extensions:1.1.1'

MISE À JOUR

implementation "androidx.lifecycle:lifecycle:extensions:2.2.0-alpha04"

Dans la dernière version, ViewModel peut être déclaré comme ci-dessous

val mFavViewModel = ViewModelProvider(activity)[FavouritesViewModel::class.Java]
12
Mittal Varsani

Essayez avec ci-dessous

var mFavViewModel = ViewModelProviders.of(activity).get(FavouritesViewModel::class.Java)
2
Mehul Kabaria