首页 > 解决方案 > 为什么当我尝试存储状态时对象不需要添加@Parcelize?

问题描述

我正在通过文章学习 Compose 。

文章告诉我:

添加到 Bundle 的所有数据类型都会自动保存。最简单的解决方案是将@Parcelize 注解添加到对象中。

它给了我示例代码。

@Parcelize
data class City(val name: String, val country: String) : Parcelable

@Composable
fun CityScreen() {
    var selectedCity = rememberSaveable {
        mutableStateOf(City("Madrid", "Spain"))
    }
}

以下代码来自项目

我发现data class Post不添加@Parcelize,并且val featured = remember { PostRepo.getFeaturedPost() }可以,为什么?

@Composable
fun Home() {
    val featured = remember { PostRepo.getFeaturedPost() }
    val posts = remember { PostRepo.getPosts() }
    ...
}


object PostRepo {
    fun getPosts(): List<Post> = posts
    fun getFeaturedPost(): Post = posts.random()
}


@Immutable
data class Post(
    val id: Long,
    val title: String,
    val subtitle: String? = null,
    val url: String,
    val metadata: Metadata,
    @DrawableRes val imageId: Int,
    @DrawableRes val imageThumbId: Int,
    val tags: Set<String>
)

@Immutable
data class Metadata(
    val author: PostAuthor,
    val date: String,
    val readTimeMinutes: Int
)

@Immutable
data class PostAuthor(
    val name: String,
    val url: String? = null
)

标签: androidandroid-jetpack-compose

解决方案


虽然remember可以帮助您在重新组合中保留状态,但不会在配置更改中保留状态。为此,您使用rememberSaveable. RememberSaveable自动保存任何可以保存在Bundle. 对于其他值,您可以传入自定义保护程序对象。

由于RememberSaveable自动保存任何可以保存在 Bundle 中的值,因此它要求类Parcelable与 remember 不同。


推荐阅读