无法在 Kotlin 中创建类 ViewModel 的实例

Al *_*hik 0 android constructor viewmodel kotlin

我正在尝试在 Fragment 中初始化视图模型,但是每次我想在我的视图模型构造函数中传递接口时,它都会抛出错误无法创建类 ViewModel 的实例 而且我在kotlin-kapt或任何生命周期注释中没有任何问题

这是我的 ViewModel 类

class SettingsViewModel (
       var settingsView: SettingsView
    ) : ViewModel(){ }
Run Code Online (Sandbox Code Playgroud)

这是我要初始化视图模型的片段

class SettingsFragment : Fragment(), SettingsView {

     var viewmodel :SettingsViewModel? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

         viewmodel = ViewModelProviders.of(this).get(SettingsViewModel(this)::class.java)

        val binding =
            DataBindingUtil.inflate<FragmentSettingsBinding>(inflater, R.layout.fragment_settings, container, false)
                .apply{}


        return binding.root
    }
Run Code Online (Sandbox Code Playgroud)

Ric*_*rdo 6

当您在没有工厂的情况下通过 ViewModelProviders 初始化 ViewModel 时,这意味着您只能实例化一个没有构造函数参数的 ViewModel。像这样:

viewmodel = ViewModelProviders.of(this).get(SettingsViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

请注意,您不能将参数传递给 .class 调用,因为您没有调用构造函数

由于您的 ViewModel 具有构造函数参数,您需要实现 ViewModelProvider.Factory 以便能够使用给定参数检索其实例。

这是对 android 开发者的参考:https : //developer.android.com/reference/android/arch/lifecycle/ViewModelProvider

这里参考了一篇文章,可以让你深入了解如何实现工厂:https : //medium.com/@marco_cattaneo/android-viewmodel-and-factoryprovider-good-way-to-manage-it-with-dagger -2-d9e20a07084c