【问题标题】:Viewmodel factory? is it something i need?视图模型工厂?这是我需要的东西吗?
【发布时间】:2021-10-03 10:28:26
【问题描述】:

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

java.lang.RuntimeException:无法创建类 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
    }


}

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 上最新的教程,这对我很有帮助。

【问题讨论】:

  • is it something i need? 那么,视图模型工厂是做什么的?

标签: android kotlin mvvm viewmodelfactory


【解决方案1】:

您的ViewModel 包含一个存储库,从那时起您必须使用ViewModelFactory。你可以使用ViewModelProvider:

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

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

val viewModel: AuthViewModel by viewModels { factory }

【讨论】:

  • 您可以使用ViewModelFactoryviewModels 代表:val viewModel: AuthViewModel by viewModels { factory }
  • 我不知道!我会更新答案:)
  • 另外,如果 ViewModel 有一个空的构造函数或只接受一个 Application 的构造函数,你可以让它使用默认工厂,不向 viewModels() 传递任何内容。
猜你喜欢
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多