微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不会重新创建通过片段提供给Fragments的Parcelable objetcs

如何解决不会重新创建通过片段提供给Fragments的Parcelable objetcs

...意味着无论如何,您都使用相同的当前指针指向内存中的同一对象。

您注意到了吗?


与调试器一起解决一个不相关的问题,我很惊讶地发现我的可包裹对象在创建片段之前和操作时具有相同的实例编号。在所述片段中。

我在继承@Parcelize的数据类上使用Kotlin Parcelable,并查看其文档,只是说它将为您生成所需的样板代码(创建者,写入包裹等)。 )。

问题易于复制:

  1. 创建一个data class
@Parcelize
data class UserData(
    val id: Int,var name: String
    var age: Int
) : Parcelable
  1. 假设您处于“片段”或“活动”中(实际上并不重要)
  2. 您创建ChangeUserDataFragment,并在用户单击按钮修改其个人资料数据后立即设置其参数:
companion object {
    fun instantiate(userData: UserData) = 
        ChangeUserDataFragment().apply {
            arguments = bundleOf("user_data" to userData)
        }   
}
  1. 您通常会显示ChangeUserDataFragment
  2. 在现在显示ChangeUserDataFragment中,用户更新其nameage并验证所做的更改,从而使他回到显示个人资料数据之前的状态。
  3. 如果在第3步和第4步中在相关的生命周期回调中使用调试器,则会注意到您一直在使用相同的userData 实例(实例编号是一样的)。 从在父Fragment /宿主活动中创建它一直到用户在您的ChangeUserDataFragment中编辑其值的时间。

换句话说,这显然是边缘效应的一种情况,其中在另一个片段上对可包裹objetc进行的修改在创建它的视图(宿主“活动”或父片段)中是显而易见的。

这可以使用本机Fragment(已弃用)和AndroidX Fragment框架重新创建。但是,无法在活动之间(通过其Intent的附加功能)重新创建:对象已重新创建。

---> 这是正常行为吗?它记录在某处吗? 在我的所有岁月中,我一直被认为,在Activity的Intent的Extras和Fragments的论据之间来回发送时,Parcelable一直都是序列化和反序列化的。

那如何保存Fragment的实例状态呢?当您使用“片段”恢复“活动”时,应该可以访问其参数数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。