如何解决无法使用ViewModelProviderFactory类创建androidviewmodel的实例
我在创建扩展androidviewmodel的viewmodel实例时遇到问题。 错误在此行上(返回modelClass.getConstructor()。newInstance())。
这是视图模型:
class IdiomViewModel(application: Application): AndroidViewModel(application) {
private val readAllData: LiveData<List<IdiomDB>>
private val repository: IdiomRepository
//the init block is execute first whe viewmodel is quote
init {
val idiomDao = IdiomDatabase.getDatabase(application).idiomDao()
repository = IdiomRepository(idiomDao)
readAllData = repository.readAllData
}
//is recommended to run database on the background thread
// viewModelScope- part of coroutines
fun insertIdiom(idiomDB: IdiomDB){
viewModelScope.launch(Dispatchers.IO){
repository.addIdiom(idiomDB)
}
}
}
这是ViewModelProviderFactory
class ViewModelProviderFactory :
ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return modelClass.getConstructor().newInstance()
}
这是片段
class IdiomFragment : Fragment(),IdiomAdapter.OnItemClickListener {
private lateinit var groupContentRecView: RecyclerView
private lateinit var adapter: IdiomAdapter
private lateinit var viewModel: IdiomViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//Can`t create instance of the viewmodel
val viewModelProvider =ViewModelProviderFactory()
viewModel = ViewModelProvider(requireActivity(),viewModelProvider).get(IdiomViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View {
val binding = DataBindingUtil.inflate<FragmentIdiomBinding>(
inflater,R.layout.fragment_idiom,container,false
)
binding.idiomViewModel = viewModel
return binding.root
}
这是个例外
Process: com.example.americanidiomandphrases,PID: 18424
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:502)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NoSuchMethodException: com.example.americanidiomandphrases.data.IdiomViewModel.<init> []
at java.lang.Class.getConstructor0(Class.java:2332)
at java.lang.Class.getConstructor(Class.java:1728)
at com.example.americanidiomandphrases.viewmodels.ViewModelProviderFactory.create(ViewModelProviderFactory.kt:10)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。