首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

由rememberSaveable状态组成的安卓Jetpack无法幸免于返回按钮

基础概念

rememberSaveable 是 Jetpack 中 ViewModel 的一个扩展函数,它允许 ViewModel 在配置更改(如屏幕旋转)或系统内存紧张时保存状态。这是通过 SavedStateHandle 实现的,它提供了一种机制来持久化和恢复 ViewModel 中的数据。

相关优势

  1. 状态保存rememberSaveable 确保在配置更改或内存紧张时,ViewModel 中的数据不会丢失。
  2. 简化代码:开发者无需手动保存和恢复状态,减少了样板代码。
  3. 生命周期感知ViewModel 与 Activity 或 Fragment 的生命周期紧密集成,确保数据在正确的时机被保存和恢复。

类型

rememberSaveable 是一个扩展函数,它接受一个键和一个可序列化的值作为参数,并返回一个 StateFlowSharedFlow

应用场景

在需要跨配置更改(如屏幕旋转)或系统内存紧张时保持状态的场景中,rememberSaveable 非常有用。例如,在表单编辑、游戏进度保存或任何需要持久化用户输入的场景中。

问题及解决方案

问题:由 rememberSaveable 状态组成的安卓 Jetpack 无法幸免于返回按钮

原因: 当用户按下返回按钮时,Activity 或 Fragment 可能会被销毁,导致 ViewModel 中的状态丢失。虽然 rememberSaveable 可以在配置更改时保存状态,但它并不能阻止 Activity 或 Fragment 在用户按下返回按钮时被销毁。

解决方案

  1. 使用 onSaveInstanceStateonRestoreInstanceState: 在 Activity 或 Fragment 中重写 onSaveInstanceStateonRestoreInstanceState 方法,手动保存和恢复状态。
  2. 使用 onSaveInstanceStateonRestoreInstanceState: 在 Activity 或 Fragment 中重写 onSaveInstanceStateonRestoreInstanceState 方法,手动保存和恢复状态。
  3. 使用 SavedStateHandle: 通过 SavedStateHandle 手动保存和恢复状态。
  4. 使用 SavedStateHandle: 通过 SavedStateHandle 手动保存和恢复状态。
  5. 使用持久化存储: 将状态保存到数据库或 SharedPreferences 中,确保即使 Activity 或 Fragment 被销毁,状态也不会丢失。
  6. 使用持久化存储: 将状态保存到数据库或 SharedPreferences 中,确保即使 Activity 或 Fragment 被销毁,状态也不会丢失。

参考链接

通过以上方法,可以确保在用户按下返回按钮时,ViewModel 中的状态不会丢失。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Jetpack-Compose 学习笔记(五)—— State 状态是个啥?又是新概念?

组合:按照文档上意思我觉得可以理解为展示给用户界面,是多个组合项(Composable组件)组成。 Event事件:指的是从应用外部生成输入,用于通知程序某部分发生了变化。...其实 remember 关键字使用是两部分组成: key arguments:表示这次调用使用 “键”(key),用圆括号包裹; calculation :一个 Lambda 表达式,计算得出需要存储...调用方不需要控制状态。缺点是,具有内部状态可组合项复用性往往不高,也更难以测试。 无状态可组合项就是指无法直接更改任何状态 Composable 组件。...状态存储其他方式 前述所说,remember 关键字可存储组合项中状态,但是一旦组合项被移动,这些状态就丢失了,那如果涉及到横竖屏切换等 Activity 重建应用场景,该怎么办呢?...remember 关键字是根据传入键是否改变来返回相应值。键改变了则返回初值;键未变则返回上次存储值。不设置键,则默认键始终不变,即始终取上次值。

2.1K30

AndroidStudio 开发基础知识【翻译完成】

应用 八、AndroidStudio 代码编辑器基础 九、架构概述 十、应用剖析 十一、视图绑定概述 十二、了解应用和活动生命周期 十三、处理活动状态变化 十四、活动状态变化示例...实时数据教程 三十五、 Jetpack 数据绑定概述 三十六、 Jetpack 数据绑定教程 三十七、视图模型保存状态教程 三十八、使用生命周期感知组件 三十九、 Jetpack...、活动状态变化示例 二十二、保存和恢复活动状态 二十三、了解视图、视图组和布局 二十四、AndroidStudio 布局编辑器工具指南 二十五、约束布局指南 二十六、AndroidStudio...视图模型教程 四十一、 Jetpack 实时数据教程 四十二、 Jetpack 数据绑定概述 四十三、 Jetpack 数据绑定教程 四十四、视图模型保存状态教程 四十五、使用生命周期感知组件...虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们服务器已经记录所有的翻译,因此您不必担心会因为您失误遭到无法挽回破坏。

3.2K30
  • Jetpack Compose中MVVM实现及ViewModel和remember对比

    remember/rememberSaveable 在Compose中,remember和rememberSaveable都是用于保存可组合函数状态方法,但它们在如何保存状态以及在什么情况下会重新计算状态上有所不同...var password by rememberSaveable { mutableStateOf("") } 因此,rememberSaveable提供了对状态持久化支持,而remember则仅在组件生命周期内保存状态...具体来说,mutableStateOf 函数接受一个初始值作为参数,并返回一个包含该初始值 MutableState 对象。...总的来说: mutableStateOf 作用是在 Jetpack Compose 中创建可变状态,以便动态更新 UI,并确保 UI 反映最新状态值。...但是在这种情况下,MyList 组件在 mList 改变时并不会重新组合,因为 Compose 无法检测到列表数据更改。

    1.2K11

    写给初学者Jetpack Compose教程,使用State让界面动起来

    虽说rememberSaveable是remember增强版,但这并不意味着我们直接简单粗暴地把所有remember都替换成rememberSaveable就行了,还是要根据具体UI需求来做出合理选择...唯一区别就是,第一个函数count是State对象赋值,而第二个函数count则是传递进来参数。...可以看到,Counter函数中移除了count变量声明,改成了使用参数传递模式。同时,当按钮被点击时,因为我们已经无法对State变量进行写入,这里改用了回调方式将点击事件通知到上一层。...你会发现,在状态提升之前,Counter函数是无论如何都无法实现两种不同逻辑计时器,除了再复制另写一份DoubleCounter函数,别无他法。...其次,就算是做了刷新操作,TextField刷新后发现value参数指定内容仍然是一个空字符串,因此我们输入内容还是无法上屏。

    1.1K20

    软件开发:怎么快速上手JetPackComposeUI框架

    一、项目背景 官方地址:https://m3.material.io/ Jetpack Compose 是 Google 推出现代 UI 框架,彻底改变了应用界面开发方式。...不同于传统命令式编程模式,Compose 不要求开发者手动管理 UI 状态和更新,系统会自动根据状态变化进行重新组合和刷新。...四、状态管理与重组 Jetpack Compose 提供了简洁状态管理机制。开发者只需声明状态,使用 remember 和 mutableStateOf 跟踪状态变化。...Compose 出现简化了应用 UI 开发流程。...结合实时预览功能与内置 Material Design 支持,Compose 无疑是开发未来方向。掌握这些基础知识和不断实践,所以可以快速上手 Jetpack Compose。

    20900

    软件开发:学习Jetpack Compose实现Navigation组件App

    通过 NavController,我们可以轻松管理页面之间切换。当用户在第一个页面点击按钮时,触发 navController.navigate() 跳转到第二个页面,输入用户输入内容。...Compose状态管理 Compose 状态管理与传统开发模式有很大不同。...3.3 布局和组件灵活使用 Jetpack Compose 提供了丰富 UI 组件和布局工具,但由于它是声明式,我们必须思考如何将 UI 组件与状态管理紧密结合。...尤其是在复杂布局和动态更新时,需要考虑如何合理地Jetpack Compose 提供了丰富 UI 组件和布局工具,但由于声明式特性,我们必须思考如何把 UI 组件与状态管理紧密结合。...展望未来,Jetpack Compose 很快要成为开发主流,它声明式开发模式使 UI 和业务逻辑分离得很彻底。这次Demo开发让我很熟悉如何在实际App中使用Compose上手方法。

    25682

    Jetpack Compose有学必要吗?未来前景将会怎样?

    Compose是一个声明式UI框架,随着了今年和苹果两大移动平台相继推出自己UI开发框架Jetpack Compose 和SwiftIUI,标志着移动操作系统正式全面拥抱声明式 UI 开发模式。...直观 Kotlin API:只需描述界面,Compose 会负责处理剩余工作。应用状态变化时,界面会自动更新。 加快应用开发:兼容现有的所有代码,方便随时随地采用。...image.png 如何学习 这里给大家分享一份谷歌大佬亲自整理一份《Jetpack Compose 入门到精通》PDF学习手册,外网分享找到,我自己整理尝试翻译了下,有需要朋友,可以直接划到文末自取...插槽API 这里不是教你Jetpack Compose 一些基本使用方法,而是为啥我们需要Jetpack Compose 一些简洁,让大家对Jetpack Compose 有更深层次了解......Jetpack Compose应用(二) 3. Jetpack Compose应用做一个倒计时器 4. 用Jetpack Compose写一个玩App 5.

    3.2K30

    【译】JetPack Compose for Desktop 初体验

    由于某些原因,Main.kt 在右上角“运行”按钮旁边没有被默认选中,所以它会要求你配置项目。为了解决这个问题,你需要在 Main.kt 文件内主函数旁边点击绿色“运行”按钮。...文字按钮。如果你点击它,按钮里面的文字就会变成“Hello, Desktop!”,来看一下实际体验效果吧。 ?...在诸如按钮、文本字段等 UI 组件中,我们使用 remember 作为文本状态,这样当我们在未来更新这个 text 变量时,与该变量相关视图也会更新显示文本。...Jetpack Compose Components (Part 2)[4] 下一段代码是定义一个具有点击功能按钮,并将整个应用窗口设置为 Material 主题。...如下所示: 总结 目前,Jetpack Compose 在桌面和上都处于非常早期阶段,但它仍然展现出为构建 UI 所作出巨大进步。

    5.2K30

    第三夜 概念漫游(上)

    程序员在该方法中,设计Activity在目标状态效果:实现特定页面布局,为按钮注册回调函数,访问互联网获取信息等。再比如,Activity从暂停到恢复状态,会执行onRestart()方法。...在该状态过程中,士兵执行预设动作,即装填子弹,随即进入射击待命状态。 ? Activity状态与转换方法 有趣是,一个Activity与互联网上一个Web页面非常相似。...Service 应用得当,骑兵是战场上一把利剑。 军团另一个重要组成部分是Service。在应用中,Activity负责界面大部分时间处于相对静止状态,直到有特定触发时间发生。...系统根据Intent要求,在整个系统范围内遍历,找到合适app来处理。合适与否,是接收方Intent Filter来决定。...Intent和Intent Filter 总结 这里提到了开发中最基本一些概念。大体看来,一个应用总是数个功能单元构成,这些功能单元由Intent连接。我将在后面的文章中,深入更多细节。

    1.1K80

    软件开发:使用Jetpack Compose实现DrawerMenuApp

    通过 Jetpack Compose,开发已经从传统 XML 布局转向了声明式 UI 方式,简化了很多工作。...用户可以直接通过滑动关闭这个抽屉,而不是必须点击关闭按钮。 • 这为用户提供了更流畅体验。...(2) 解释: • PermanentDrawerSheet 与前两种抽屉不同,它是固定在界面左侧,用户无法将它关闭。它适合那些需要一直显示导航场景,比如电子邮件客户端或者文件管理器。...,通过 DrawerState 控制 Drawer 显示和隐藏状态。...五、总结 通过这个DrawerMenuAppDemo,展示了如何在Jetpack Compose M3中实现一个带有抽屉菜单应用,添加更多菜单项以及对应页面功能。

    41450

    京喜小程序首页无障碍优化实践

    精简状态不提示或提示不符合障碍用户理解习惯,导致用户无法了解正确信息,诸如是否已加入购物车等。 焦点逻辑混乱或没有遵循正确读屏浏览模式,致使用户不能便捷、清晰地了解界面信息,严重影响操作效率。...整块元素读取 一个元素可能很多子元素组成。在无障碍模式下,读屏软件只能分别聚焦子元素,单独将每个子元素信息读出来。障碍用户在读屏软件辅助下,获取到都是元素零零碎碎信息,这样体验很不友好。...、返回顶部按钮、菜单栏按钮…… ?...关闭按钮返回顶部按钮、菜单栏按钮 <View className='back-top' aria-role='button' aria-label='<em>返回</em>顶部' /> 搜索框读取... 轮播图读取 轮播图多个子元素组成,但点击为整块点击,且每个子元素都是图片,读屏软件无法让用户清晰感知元素含义

    1.3K31

    软件开发:Jetpack Compose、Material 3和Kotlin协程在Android开发协程App

    PS:适合已有编程基础开发者,如果你是初学者,建议先看看我另一篇基础文章:软件开发-手把教讲解Kotlin协程-腾讯云开发者社区-腾讯云 (tencent.com) 2.1 构建 UI(这部分不做详细介绍...比赛状态 raceInProgress 控制,当状态变更时,界面会响应。 2.5 开发选手状态管理 (1)RaceParticipant 类是每个选手状态持有者,通过协程更新每个选手进度。...这是 Jetpack Compose 中常用方式,通过 mutableStateOf 可以保证 UI 在状态改变时自动刷新。...用于在用户点击“重置”按钮时,重置赛跑状态。...状态管理:在Jetpack Compose中管理状态是一个非常大挑战,特别是涉及到多个组件和协程时,使用mutableStateOf和remember保证状态一致性和内存效率。

    489235

    Rafel RAT恶意软件可能影响39亿台旧手机

    威胁攻击者正在大量部署一种名为「Rafel RAT」开源恶意软件,攻击「过时」设备。...其中一些攻击活动是 APT-C-35(DoNot Team)等知名勒索软件组织发起,伊朗和巴基斯坦疑似为恶意活动源头。...Check Point 分析大量网络攻击活动后发现,受害者运行版本已达到生命周期终点(EoL),其中 87.5% 运行 11 及以上版本,只有 12.5% 受感染设备运行 Android 12...鉴于很多「过时」版本不再接受安全更新,因此容易受到已知/已发布漏洞攻击。据此推测,有超过39亿台设备/手机(包括用户弃用)或被暴露在这一威胁之下。...Rafel RAT 恶意软件行动由中央面板控制,威胁攻击者可在此访问设备和状态信息,并决定下一步攻击步骤。

    13410

    Jetpack Compose+架构=优秀APP?

    Compose无法获得Presenter 持有一个 View 层对象引用,因为用来创建 UI Composable 必须要求返回 Unit。...所以MVP这种依赖接口通信解耦方式无法在 Compose 项目中使用。...3.不论是用户操作导致Model发生变化,还是Model频繁发生变化,开发者都需要主动更新将变化数据同步更新,这样工作既繁琐又很难维护多变数据状态。...Jetpack Compose应用做一个倒计时器 数据结构 倒计时功能 状态模式 Compose 布局 绘制时钟 [08257e29e6cb6d7554f21982d1ba1ee3.png] 4....用Jetpack Compose写一个玩App 准备工作 引入依赖 新建 Activity 创建 Compose PlayTheme 画页面 底部导航栏 管理状态 添加页面 [274bc5afd753120deda3ee7347399959

    1.7K20

    我们破解了几乎所有旗舰手机的人脸识别,iPhone幸免于

    但智能手机应该保护用户数据,使其免于泄露,而不是侵犯隐私。 如果你是一位手机用户,那么请马上把手机从眼前移开。...为了测试破解智能手机难易程度,福布斯记者用 3D 打印头部测试了四款畅销/苹果智能手机。遇到假的人脸,所有的手机都被打开,但苹果却未被攻破。...复制你头 用于测试 3D 打印头部是英国伯明翰 Backface 公司制作。...Backface 公司制作 3D 打印头部 实验过程中,福布斯记者使用了与自己头部大小相同模型在 5 台手机上进行了测试,其中包括一台 iPhone X 和四台手机:LG G7 ThinQ、...结果四台手机全部解锁,只是解锁难度有所区别。iPhone X 是唯一幸免于手机。 手机抵抗攻击性能也存在差异。如,首次打开这部全新 G7 时,LG 曾提醒用户不要打开人脸识别。

    3.4K30

    说说微信支付那点事

    审核通过之后他会给你往申请时候邮箱发邮件(信息很重要不要丢),然后你微信开放平台微信状态就是这种了 。       ?...配置好之后就是头疼问题了: 在微信开放平台上你会看到微信支付开发文档(不是很详细),可以下载iOS和SDK。...iOS和demo都模拟了统一下单过程。微信支付签名是用sha1+md5方式,请求是post发送xml格式数据,得到服务器返回预支付id和一些信息之后。    ...所以跳进去之后调不起微信返回错误码-1      第二次补充: 还有一个原因是参数格式错误(看一下你们汉字编码)  解决办法:      删掉友盟微信API,2个h文件,一个.a静态库  端:...      demo没有太多注释,   我出现了demo模拟下单签名之后第一次可以调用重复无法调用状况,接入正式项目问题就好了。

    1.1K20

    告诉你 Jetpack+MVVM 组合开发APP有多优秀!

    前言 Jetpack 架构组件 及 标准化开发模式 的确立,意味着 Android 开发已步入成熟阶段。现在Android岗招人时候也非常看重应试者对 Jetpack 架构组件理解程度。...今天要带给大家Jetpack+MVVM 魔法,教你用Jetpack结合MVVM开发出优秀APP!...现在 Google 应用市场中,大部分 APP 已经开始使用 Android Jetpack。 ? ▲ 2018年版本 Jetpack 优势有很多: UI和业务逻辑解耦。...从Model-View-ViewModel 这个名字来看,它三个部分组成,其中视图模型(ViewModel)其实就是 PM 模式中展示模型。...为了帮助早日进阶成为高级工程师,我们特邀中国联通资深架构师Allen老师为大家带来《基于ArtifactoryMVVM+Jetpack项目实战训练营》系列直播课程,让大家从OOM和分页、错误处理等重复代码中解放出来

    1K30

    RN与原生通讯(篇)一、RN调用代码(简单)二、RN用消息机制方式与原生代码切换三、RN用Promise机制与原生代码通信四、RN用callback回调方式与原生代码通信

    Promise机制方式:js调用,只是每次使用都需要调用。 一、RN调用代码(简单) RN调用原生代码,大致分为如下几步。...调用原生代码方式就得以实现。...二、RN用消息机制方式与原生代码切换 实现效果:在原生代码中添加一个按钮,当用户从RN界面调用原生代码就会进入到原生代码开发界面中,而点击原生代码中按钮就会返回到RN界面。 ?...将左下角Design切换成Text文件。在该文件中,为原生界面创建一个按钮并且布局。 ? xmlns:android表示设置xmlns命名空间,没有这句话就无法设置属性约束。...在使用回调函数时会呈现出某些缺点,比如说每次调用只应当调用一次,多次调用可能会出现意想不到结果,并且用这种方法原生代码是无法主动发送信息给RN侧。而消息机制方式就可以进行消息互相传递。

    3.8K70

    软件开发:Jetpack Compose 和 Material 3 实现高级登录页面(Kotlin)

    PS:适合已有编程基础开发者,如果你是初学者,建议先看看我另一篇基础文章:软件开发:用Java和Kotlin构建MDC-UI框架实现LoginUI(基础)-腾讯云开发者社区-腾讯云 (tencent.com...• 两个按钮:分别为“Cancel”按钮和“Next”按钮。...四、学习笔记 我加深了对 Jetpack Compose 理解,还掌握了如何在实际项目中灵活使用状态管理和组件解耦。...五、总结和展望 通过本篇文章实践,我体验到了 Jetpack Compose 强大好处是Jetpack Compose声明式编程带来直观、简化 UI 构建、灵活状态管理,以及 Material...让我对未来开发充满了很多期待。相信 Jetpack Compose 在未来几年成为 Android UI 开发主流工具,希望这篇文章能对大家有所帮助!!

    555183
    领券