Search code examples
androidkotlinmvvmandroid-roomandroid-viewmodel

Viewmodelprovider context type missmatch in fragment


i'm trying to make a simple todo app with room database and mvvm when i try to provider the view model in the fragment i'm always getting an error for the miss type of the view model provider contex because he wants a view model store owner type and i'm giving him a (THIS) of the fragment and i have implementation every thing of model and tried every thing to fix it and still

listfragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val xml= inflater.inflate(R.layout.fragment_listfragment, container, false)
    val list=ArrayList<shopinglist>()
    viewmodel= ViewModelProvider(this).get(Listviewmodel::class.java)
                         error is here 


    xml.recyclerView.layoutManager= LinearLayoutManager(context, RecyclerView.VERTICAL,false)
        xml.recyclerView.adapter=Customadapterforrecyle(this,list)

    xml.btnlist.setOnClickListener {
     


    }
return xml
}
}

class Listviewmodel(application: Application): AndroidViewModel(application) {
  lateinit var  readallitem : LiveData<List<shopinglist>>
  lateinit var Reposotory:repository
  init {
      val dao=database.getdatabase(application).getlistgdao()
       Reposotory=repository(dao)
       readallitem=Reposotory.getallitem()
  }
    fun insert(item:shopinglist)=CoroutineScope(Dispatchers.IO).launch {
        Reposotory.insert(item)
    }
    fun delete(item:shopinglist)=CoroutineScope(Dispatchers.IO).launch {
        Reposotory.delete(item)
    }
}

Solution

  • Make sure You have the appropriate Fragment imported. You might have the one from the android.app package:

    import android.app.Fragment;
    

    This one does not implement the ViewModelStoreOwner interface. On the other hand the Fragment from the androidx.fragment.app package does. Replace the previous import with this one:

    import androidx.fragment.app.Fragment;