android - 使用 navGraphViewModels() [with Hilt] 初始化接口(interface) ViewModel 时出现 ClassCastException

标签 android kotlin classcastexception android-viewmodel dagger-hilt

我有一个使用导航图限定范围的 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/

相关文章:

java - 恢复崩溃的输入流

java - 如何导入导入org.apache.poi.ss.usermodel.Row错误?

android - 带有两个操作按钮的自定义通知

java - 为什么这个类型需要显式强制转换?

java - 防止对 Java/Kotlin 中的类的依赖,但允许扩展

c# - 为什么从 IEnumerable<string> 转换为 List<string> 会失败?

Android: View 在调用setContentView R.layout之前显示

android - 如何用android检测抖动事件?

kotlin - 可以将 String 映射/减少为 Int 吗?

java - 什么可能导致 Collections.sort(List<T>, Comparator<? super T>) 抛出 ClassCastException?