如何结合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
相关产品推荐
相关产品推荐

