我有一个使用导航图限定范围的 fragment 流,并希望相应地限定每个 fragment 的 ViewModel。但是,我不希望每个 Fragment 都可以访问 ViewModel 中的所有方法和变量,因此每个 Fragment 的 ViewModel 都是在基础 ViewModel 中实现的接口(interface)。
我在每个 fragment 中使用 by navGraphViewModels()
委托(delegate),但它似乎无法将接口(interface)转换为基类。
跟踪错误是:
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>()
这样的类型参数传递给委托(delegate).因此,委托(delegate)错误地尝试创建接口(interface)的新实例 ExampleViewModelController
而不是 ExampleViewModel
.
关于android - 使用 navGraphViewModels() [with Hilt] 初始化接口(interface) ViewModel 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70123706/