视图模型工厂?这是我需要的东西吗?



我正在使用MVVM结构在kotlin编程一个应用程序。我试图通过我的工厂实例化我的视图模型。虽然我得到一个错误,当我启动应用程序。它说这'

. lang。RuntimeException:不能创建类com.example. papersold .ui.menu. viewmodels . authviewmodel的实例

我完全不知道为什么会遇到这种麻烦。我的代码看起来像这样

我已经尝试跳过工厂实现。我现在不会在kotlin中使用这种实现mvvm的方式。我会看一下2021年更新的教程。

LoginRegister_fragment:

package com.example.paperseller.ui.menu
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.paperseller.Data.User
import com.example.paperseller.R
import com.example.paperseller.databinding.LoginRegisterFragmentBinding
import com.example.paperseller.ui.menu.ViewModels.AuthViewModel

class LoginRegister_fragment : Fragment(R.layout.login_register_fragment) {
private var _binding : LoginRegisterFragmentBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
{
_binding = LoginRegisterFragmentBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initializeUI()
}
private fun initializeUI()
{
val factory = InjectorUtils.providePaperSellerViewModelFactory()
val viewModel : AuthViewModel by viewmodels()
viewModel.message.observe(this)
{
message ->
Toast.makeText(requireActivity(), message, Toast.LENGTH_LONG).show()
}
binding.registerButton.setOnClickListener()
{
val user = User(binding.emailText.text.toString(), binding.passwordText.text.toString());
viewModel.register(user)
}
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}

}

ViewModelFactory:

package com.example.paperseller.ui.menu.ViewModelFactory
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.paperseller.Data.PaperSellerRepository
import com.example.paperseller.ui.menu.ViewModels.AuthViewModel
class PaperSellerViewModelFactory(private val paperSellerRepository: PaperSellerRepository) : ViewModelProvider.NewInstanceFactory()
{
@Suppress("UNCHECKED_CAST")
override fun <T:ViewModel?> create(modelClass: Class<T>):T{
return AuthViewModel(paperSellerRepository) as T
}
}

我试着遵循这个教程:https://resocoder.com/2018/09/07/mvvm-on-android-crash-course-kotlin-

这个教程是4年前的。提示人们看到这个问题。查看youtube上最新的教程,这对我帮助很大。

您的ViewModel占用存储库,从那时起您必须使用ViewModelFactory。您可以使用ViewModelProvider:

val factory = InjectorUtils.providePaperSellerViewModelFactory()
val viewModel = ViewModelProvider(
this,
factory)
.get(AuthViewModel::class.java)

或者,正如@IR42所指出的,您可以使用viewModels委托:

val viewModel: AuthViewModel by viewModels { factory }

最新更新