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

时间:2019-07-10 07:52:31

标签: android kotlin constructor viewmodel

我正在尝试在Fragment中初始化 viewmodel ,但是每次我想在我的viewmodel构造函数中传递接口时,都会引发错误无法创建ViewModel类的实例 另外,我在 kotlin-kapt 或任何生命周期注释

中都没有问题

这是我的ViewModel类

class SettingsViewModel (
       var settingsView: SettingsView
    ) : ViewModel(){ }

这是我要初始化viewmodel的片段

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
    }

2 个答案:

答案 0 :(得分:2)

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

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

请注意,由于您没有调用构造函数,因此无法将参数传递给.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

答案 1 :(得分:0)

就我而言,我忘记添加

AndroidInjection.inject(this); 

在我这样的活动中:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);