Граф навигации с областью ViewModel при смерти процесса

Пока я пытаюсь справиться со смертью процесса в своем приложении для Android, я заметил, что ViewModel, которая была привязана к графу навигации, давала сбой при воссоздании после смерти процесса. Ниже приведен код ViewModel и фрагмента, который использует ViewModel.

@ExperimentalCoroutinesApi
@HiltViewModel
class ViewPrintOrderVM @Inject constructor(
private val repository: Repository,
private val application: Application,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {

     // Code inside the ViewModel

}

И в моем фрагменте я получаю ссылку следующим образом

@ExperimentalComposeUiApi
@ExperimentalCoroutinesApi
@AndroidEntryPoint
class ComposeFragmentPostPressDetails : Fragment() {

        //Here we are scoping the ViewModel to the Navigation graph with graph-id instead of this fragment
        private val viewModel: ManagePrintOrderVM by navGraphViewModels(R.id.print_order_flow)

       //Rest of the Fragment code

}

Теперь, когда я пытаюсь проверить приложение на предмет смерти процесса, запустив приложение в эмуляторе, поместив его в фоновый режим, а затем уничтожив процесс с помощью кнопки «Завершить приложение» в студии Android, он вылетает при воссоздании со следующим ошибка

2022-03-19 19:06:44.633 7174-7174/com.sivakasi.papco.jobflow E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sivakasi.papco.jobflow, PID: 7174
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sivakasi.papco.jobflow/com.sivakasi.papco.jobflow.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.sivakasi.papco.jobflow.screens.manageprintorder.ManagePrintOrderVM
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.sivakasi.papco.jobflow.screens.manageprintorder.ManagePrintOrderVM
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)
        at com.sivakasi.papco.jobflow.screens.manageprintorder.FragmentPaperDetails.getViewModel(FragmentPaperDetails.kt:42)
        at com.sivakasi.papco.jobflow.screens.manageprintorder.FragmentPaperDetails.observeViewModel(FragmentPaperDetails.kt:97)
        at com.sivakasi.papco.jobflow.screens.manageprintorder.FragmentPaperDetails.onViewCreated(FragmentPaperDetails.kt:59)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1333)
        at android.app.Activity.performStart(Activity.java:6992)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2780)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
     Caused by: java.lang.InstantiationException: java.lang.Class<com.sivakasi.papco.jobflow.screens.manageprintorder.ManagePrintOrderVM> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)

Тем не менее, все другие экраны, где ViewModel привязан только к этому фрагменту, а не к графу навигации, нормально работают при восстановлении процесса даже с внедрением зависимостей.

Что я делаю не так? Что мне делать, чтобы справиться со смертью процесса в потоке? Как справиться с воссозданием процесса во фрагментах, где ViewModel привязан к навигационному графу, а не к самому фрагменту или действию?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

by navGraphViewModels ничего не знает о вашей фабрике Hilt — она просто использует фабрику по умолчанию. Единственная причина, по которой это может работать в других случаях, заключается в том, что другой фрагмент, который делал использует фабрику Hilt, сначала создал ViewModel.

Согласно документация, вы должны использовать by hiltNavGraphViewModels(), чтобы использовать внедренную Hilt ViewModel, привязанную к графу навигации.

// Add this to your dependencies
implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'

// Then use it in place of navGraphViewModels()
private val viewModel: ManagePrintOrderVM by hiltNavGraphViewModels(R.id.print_order_flow)

Другие вопросы по теме