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

Я использую делегирование by navGraphViewModels() в каждом из фрагментов, но, похоже, не удается преобразовать интерфейс в базовый класс.

Ошибка трассировки:

java.lang.ClassCastException: java.lang.Object нельзя преобразовать в androidx.lifecycle.ViewModel

Любые советы о том, как подойти к этой проблеме ??

В моем фрагменте это определяется следующим образом:

@AndroidEntryPoint
class ExampleFragment : Fragment() {    

    private val viewModel: ExampleViewModelController by 
    navGraphViewModels(R.id.nav_graph_example){defaultViewModelProviderFactory}
    ///

И ViewModel определяется:

@HiltViewModel
class ExampleViewModel @Inject constructor(
    private val handle: SavedStateHandle,
    private val useCases: ExampleUseCases,
) : ViewModel(), ExampleViewModelController {

    override fun validateExampleInputs() {
       // TODO("Not yet implemented")
    }
}

И на последок интерфейс:

interface ExampleViewModelController {
    fun validateExampleInputs()
}
2
Richard Barnard 26 Ноя 2021 в 14:29

1 ответ

Лучший ответ

ClassCastException возникает из-за того, что делегату не передается параметр типа, например by navGraphViewModels<ExampleViewModel>(). Таким образом, делегат ошибочно пытается создать новый экземпляр интерфейса ExampleViewModelController вместо ExampleViewModel.

1
Wess 26 Ноя 2021 в 14:59