使用 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.