Невозможно создать экземпляр класса ViewModel в Kotlin - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь инициализировать viewmodel во Fragment, но каждый раз, когда я хочу передать интерфейс в конструкторе viewmodel, он выдает ошибку Невозможно создать экземпляр класса ViewModel Также у меня нет проблем в kotlin-kapt или в любых аннотациях жизненного цикла

вот мой класс ViewModel

class SettingsViewModel (
       var settingsView: SettingsView
    ) : 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
    }

1 Ответ

2 голосов
/ 10 июля 2019

Когда вы инициализируете ViewModel через ViewModelProviders без фабрики, это означает, что вы можете создать экземпляр 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

...