java modeland view,为什么为我的viewModel类实现ViewModelProvider.Factory很重要?

I have built a fragment that basically contains a Recyclerviewer with a custom ViewModel for my Data type using data binding and LiveData (which is a piece of code that I frequently implement) but in this time a runtime exception error has occurred!

/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.tdm_project, PID: 9460

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tdm_project/com.example.tdm_project.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.tdm_project.viewmodel.ArticleViewModel

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2799)

at android.app.ActivityThread.-wrap12(ActivityThread.java)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)

at android.os.Handler.dispatchMessage(Handler.java:110)

at android.os.Looper.loop(Looper.java:203)

at android.app.ActivityThread.main(ActivityThread.java:6269)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.tdm_project.viewmodel.ArticleViewModel

at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:154)

at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:211)

at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)

at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)

at com.example.tdm_project.HomeFragment.onCreateView(HomeFragment.kt:75)

at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)

at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)

at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)

at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)

at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)

at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)

at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)

at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)

at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)

at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)

at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)

at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)

at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:620)

at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:178)

at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)

at android.app.Activity.performStart(Activity.java:6683)

at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2697)

at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2799)

at android.app.ActivityThread.-wrap12(ActivityThread.java)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1537)

at android.os.Handler.dispatchMessage(Handler.java:110)

at android.os.Looper.loop(Looper.java:203)

at android.app.ActivityThread.main(ActivityThread.java:6269)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor

at java.lang.Class.newInstance(Native Method)

After googling my problem, the only suggestion I found is to implement a ViewModelFactory even though am using a ViewModel class and not AndroidViewModel.

ArticleViewModel class

class ArticleViewModel : ViewModel {

//lists

private var articleMList = MutableLiveData>()

private var articleInnerList = ArrayList()

constructor(

article: Article

) : super() {

//const with parameters

}

//to observe my list

fun getArticles() : MutableLiveData>{

articleMList.value = articleInnerList

return articleMList

}

//retrieve data from backend

fun getData() {

//some code

}

}

Fragment class

class HomeFragment : Fragment() {

//viewmodel

private lateinit var vmodel : ArticleViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

//set the view

rootView = inflater.inflate(R.layout.home_fragment, container, false)

//a function to initialize my recyclerview

intialiserHorizontally()

//creating the instance of viewmodel

vmodel = ViewModelProviders.of(activity!!).get(ArticleViewModel::class.java)

vmodel.getArticles().observe(this, Observer {

customHAdapter.swapData(it)

})

//getting the data from my db

vmodel.getData()

return rootView

}

My question is why it is necessary to implement a ViewModelProvider.Factory in this case?

解决方案

On its own, the ViewModel system only knows how to use a zero-argument constructor on your ViewModel subclasses (or a single-parameter constructor for AndroidViewModel subclasses). So, either:

Have no constructors at all, or

Have an explicit zero-argument constructor (but consider getting rid of your other one, as nothing should use it), or

Implement a factory, so you can call your desired custom constructor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值