Не удается создать экземпляр класса ViewModel

Нет, вы не можете ссылаться на DLL, скомпилированную в .NET 4.0, из программы, скомпилированной в .NET 3.5. Приложения .NET Framework обычно имеют обратную совместимость, то есть вы можете ссылаться на сборку .NET 3.5 из кода .NET 4.0, но обратное неверно.

Вы можете попробовать скомпилировать проект .NET 3.5 в 4.0 или компилировать сборку .NET 4.0 в .NET 3.5, любой из которых будет работать, если они являются опцией.

29
задан Parag Kadam 9 July 2017 в 15:30
поделиться

1 ответ

В моем случае причина состояла в том, что я пытался получить совместно использованный экземпляр ViewModel в моем фрагменте к скоро - прежде чем действие было создано. Это происходит, когда приложение восстанавливает свое состояние, будучи уничтоженным.

Предварительные условия :

  1. Мой ViewModel имеет общедоступного конструктора.
  2. Мой ViewModel имеет несколько аргументов. Но это прекрасно абсолютно, поскольку я использую ViewModelFactory для построения ViewModel.
  3. Мой Фрагмент и Действие доли тот же экземпляр ViewModel. Другие слова: Действие создает ViewModel, и фрагмент получает тот же экземпляр позже.

Код в действии:

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

    //factory is constructed using Dagger
    val factory = App.get().components().appComponent.getMapViewModelFactory() 
    //activity creates the instance of MapViewModel
    viewModel = ViewModelProviders.of(this, factory)[MapViewModel::class.java]
}

Код во фрагменте:

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

    //fragment receives the instance of MapViewModel
    viewModel = ViewModelProviders.of(activity!!)[MapViewModel::class.java]
    ...
}

, Когда я открываю приложение впервые, все хорошо работает: действие создает экземпляр ViewModel; я открываю Fragment, которые получают экземпляр ViewModel. Но когда, когда приложение пытается восстановить свое состояние, будучи уничтоженным, сначала оно называет тело onCreate Фрагмента и затем тело onCreate Действия. В той точке фрагмент не может получить ViewModel, поскольку Действие еще не создало его.

Решение 1 : Переместите код, когда фрагмент получит ViewModel от onCreate до onViewCreated. Который прекрасен, поскольку я наблюдаю весь liveDatas в onViewCreated также.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    viewModel = activity?.run { ViewModelProviders.of(this)[MapViewModel::class.java] } ?: throw Exception("Invalid Activity")

    viewModel.getSurveyDateLiveData().observe(viewLifecycleOwner, Observer<String> { dateTextView.text = it })
    ...
}

Решение 2 : Создайте экземпляр ViewModel в Activity.onCreate прежде , super.onCreate называют. В этом случае можно получить ViewModel во фрагменте onCreate.

override fun onCreate(savedInstanceState: Bundle?) {

    val factory = App.get().components().appComponent.getMapViewModelFactory()
    viewModel = ViewModelProviders.of(this, factory)[MapViewModel::class.java]

    super.onCreate(savedInstanceState)
    Timber.d("cc: onCreate: $this ")
}
0
ответ дан 27 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: