通过Hilt注入的SavedStateHandle在ViewModel的onClear触发时返回null是什么原因?
SavedStateHandle在ViewModel onClear()时返回null的原因
- 生命周期设计的正常表现:onClear()触发代表当前ViewModel已经永久销毁,不会再被任何宿主复用。此时SavedStateHandle关联的SavedStateRegistry已经完成了状态持久化逻辑,内部持有的内存数据引用会被主动释放避免内存泄漏,该阶段访问SavedStateHandle获取数据本就会返回null,属于官方框架的既定设计,不是异常问题。
- 自定义类型序列化失败:SavedStateHandle内部依赖Bundle存储数据,你代码中存储的
CarTypesModel如果没有实现Parcelable或Serializable接口,在ViewModel销毁触发状态持久化操作时,数据无法正常写入Bundle会被直接丢弃,后续访问对应key就会返回null。 - 存取类型不匹配:你的代码存在明显的类型不匹配问题:存入
saveStateHandle的是CarTypesModel类型,但取出时泛型指定的是TypesModel,如果两个类不存在正确的继承/转换关系,反序列化阶段会直接返回null。 - SavedStateHandle作用域不匹配:如果你的ViewModel是通过非对应宿主的ViewModelStore获取的(比如Fragment作用域的ViewModel用Activity的ViewModelStore创建),Hilt注入的SavedStateHandle没有绑定到正确的SavedStateRegistry,在宿主销毁时状态会提前被清空,也会出现访问返回null的情况。
内容的提问来源于stack exchange,提问作者Sanam Yavarpor
相关产品推荐
相关产品推荐

