使用 navGraphViewModels() [with Hilt] 初始化接口 ViewModel 时出现 ClassCastException
ClassCastException When Initialising Interface ViewModel Using by navGraphViewModels() [with Hilt]
我有一个带有导航图的 Fragment 流范围,并且想相应地确定每个 Fragment 的 ViewModel 的范围。但是,我不希望每个 Fragment 都可以访问 ViewModel 中的所有方法和变量,因此每个 Fragment 的 ViewModel 都是在基础 ViewModel 中实现的接口。
我在每个片段中使用 by navGraphViewModels()
委托,但它似乎无法将接口转换为基础 class。
跟踪错误为:
java.lang.ClassCastException: java.lang.Object 无法转换为
androidx.lifecycle.ViewModel
关于如何解决这个问题有什么建议吗??
在我的Fragment中定义如下:
@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()
}
ClassCastException 的发生是因为没有像 by navGraphViewModels<ExampleViewModel>()
那样传递给委托的类型参数。因此,委托错误地尝试创建接口的新实例 ExampleViewModelController
而不是 ExampleViewModel
.
我有一个带有导航图的 Fragment 流范围,并且想相应地确定每个 Fragment 的 ViewModel 的范围。但是,我不希望每个 Fragment 都可以访问 ViewModel 中的所有方法和变量,因此每个 Fragment 的 ViewModel 都是在基础 ViewModel 中实现的接口。
我在每个片段中使用 by navGraphViewModels()
委托,但它似乎无法将接口转换为基础 class。
跟踪错误为:
java.lang.ClassCastException: java.lang.Object 无法转换为 androidx.lifecycle.ViewModel
关于如何解决这个问题有什么建议吗??
在我的Fragment中定义如下:
@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()
}
ClassCastException 的发生是因为没有像 by navGraphViewModels<ExampleViewModel>()
那样传递给委托的类型参数。因此,委托错误地尝试创建接口的新实例 ExampleViewModelController
而不是 ExampleViewModel
.