为什么存储Compose状态时,部分自定义对象不需要添加@Parcelize注解?
二者差异的核心原因
- 首先是
remember和rememberSaveable的能力边界完全不同:remember存储的状态仅在当前Composition存活期间有效,遇到配置变更(比如屏幕旋转、系统语言切换)、进程被系统回收重建的场景时,remember存储的内容会被完全清除。它不需要将数据序列化存入Bundle,所以对存储的自定义类型没有任何序列化要求,自然不需要加@Parcelize注解。
而你在官方文档看到的rememberSaveable是专门用于解决页面重建时的状态留存问题的,它会把状态序列化后存入系统的Bundle中,所以要求存储的数据必须是Bundle原生支持的类型,或者是实现了Parcelable接口的自定义类,这就是文档要求添加@Parcelize的场景前提。 - 其次是官方示例的使用场景不需要状态持久化:示例里的
Post实例是从PostRepo中直接获取的,就算页面因为配置变更重建,remember存储的旧实例丢失,重组时会再次调用PostRepo.getFeaturedPost()拉取到完全一致的实例,用户完全感知不到状态丢失,所以不需要用到rememberSaveable,自然也不需要给Post类加@Parcelize注解。
补充说明:只有当你要存储的自定义类状态是页面内临时生成、没有在本地/服务端做持久化,需要在页面重建时保留的场景下,才需要使用rememberSaveable,这时候才需要给自定义类添加@Parcelize注解实现Parcelable接口。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

