You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合Hilt初始化SavedStateViewModelFactory实现屏幕旋转状态保存

解决方案

问题根因

你手动创建的SavedStateViewModelFactory仅能实例化构造参数仅包含SavedStateHandle的ViewModel,无法识别Hilt注入的其他依赖,因此会抛出找不到无参构造函数的异常。

正确实现步骤

  • 给ViewModel添加Hilt官方注解,声明构造参数即可,Hilt会自动生成支持SavedState的实例化工厂
@HiltViewModel
class ImagePickerViewModel @Inject constructor(
    // 必须作为构造参数注入,Hilt会自动绑定实例
    private val savedStateHandle: SavedStateHandle,
    // 其他需要Hilt注入的依赖照常声明即可
    private val imageRepo: ImageRepository
) : ViewModel() {
    // 内部业务逻辑
}
  • 在Activity/Fragment中直接使用默认ViewModel委托初始化,不需要手动传入Factory
private val imagePickerViewModel: ImagePickerViewModel by viewModels()

状态保存用法

需要跨配置变更(比如屏幕旋转)、跨进程销毁重建保留的状态,直接存入SavedStateHandle即可,系统会自动处理持久化和恢复逻辑:

// 存储状态
savedStateHandle["selected_image_list"] = selectedImageUris
// 读取状态
val savedImages = savedStateHandle.get<List<Uri>>("selected_image_list") ?: emptyList()

如果需要从页面外部传入参数到ViewModel,直接在跳转时通过Bundle传递参数即可,Hilt会自动将参数写入SavedStateHandle,不需要额外配置。

内容的提问来源于stack exchange,提问作者Ahmed Mamdouh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:06:05