android - 为什么当我尝试存储状态时对象不需要添加@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
)
解决方案
虽然remember
可以帮助您在重新组合中保留状态,但不会在配置更改中保留状态。为此,您使用rememberSaveable
. RememberSaveable
自动保存任何可以保存在Bundle
. 对于其他值,您可以传入自定义保护程序对象。
由于RememberSaveable
自动保存任何可以保存在 Bundle 中的值,因此它要求类Parcelable
与 remember 不同。
推荐阅读
- uwp - 如何在两个 UWP 应用之间快速传递实时数据?
- android - 测试 Google 登录 Android
- swift - Swift:Alamofire RequestInterceptor 错误代码
- python - 如何在python中读取excel工作簿的隐藏选项卡?
- node.js - 当我尝试在 Bitmex (ccxt) 中取款时出现“金额无效”错误
- python - 为什么在虚拟环境中使用 subprocess.run() 执行时,'python -m pip' 会运行错误的 pip?
- facebook - Facebook 像素导致奇怪的文本行为
- php - 按最近日期对对象数组进行排序
- ruby-on-rails - Rails:如何阻止 Amazon WorkMail 电子邮件从我的 Rails 应用程序进入垃圾邮件/垃圾邮件?
- curl - curl 请求消费者 MULTIPART_FORM_DATA 的资源