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

Viewmodel factory? is it something i need?

我正在使用 MVVM 结构在 kotlin 中编写应用程序。我试图通过我的工厂实例化我的视图模型。虽然我在启动应用程序时遇到错误。它说这个`

java.lang.RuntimeException: 无法创建 class com.example.paperseller.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
    }


}

视图模型工厂:

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 }