当前位置: 首页 > news >正文

安卓ComposeUI:创建一个本地保存数据

书接上回:安卓ComposeUI:创建一个变量-CSDN博客

ViewModel是管理Activity的数据,即应用正在使用的数据,如果应用重启,ViewModel的数据就会丢失,这时候就需要本地化,或远程化的数据解决方案。

一、安卓的数据保存方案

1、remember + mutableState。数据的生存周期在变量创建的那个Compose组件上面。

2、ViewModel + mutableState。数据的生存周期在活动的应用上面,比如竖屏变横屏不会销毁数据。

3、DataStore + ViewModel + mutableState。数据的生存周期在应用本地,重启应用不会销毁数据,删除应用会销毁数据。

4、远程数据方案 + ViewModel + mutableState。数据的生存周期在远程服务器,删除应用也不会销毁数据,销毁服务器的数据,才会真正销毁数据。

一个应用的数据多种多样,根据数据的存活周期选择把数据放在对应层级是更好的选择。比如Compose组件自身的状态信息只要放在remember层级即可,不需要持久化的数据放在ViewModel中即可。

二、DataStore

1、导入依赖

implementation("androidx.datastore:datastore-preferences:1.2.1") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.10.0") // implementation(libs.androidx.datastore.preferences) // implementation(libs.androidx.lifecycle.viewmodel.compose)

可以从maven仓库中获取到具体版本:https://mvnrepository.com/artifact/androidx.datastore

2、编写代码

import android.util.Log // 1.定义基础类 class AAA(val str: String = "hello") { fun speek(name: String) { Log.e("AAA", str + " " + name) } } import android.app.Application import android.content.Context import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch // 2.ViewModel。 // 创建全局dataStore private val Context.dataStore by preferencesDataStore("app_datastore") class AppViewModel(app: Application) : AndroidViewModel(app) { private val dataStore = app.dataStore var aaa by mutableStateOf(AAA()) private val dataKey = stringPreferencesKey("aaa") init { viewModelScope.launch { // 读数据 dataStore.data.collect { preferences -> val a = preferences[dataKey] ?: "" aaa = AAA(a) } } } fun edit(newValue: String) { // aaa变量是针对mutableState<AAA>类进行委托,需要使用AAA类进行赋值,不能aaa.str = newValue aaa = AAA(newValue) viewModelScope.launch { dataStore.edit { preferences -> preferences[dataKey] = newValue } } } } // 3.使用datastore+viewModel val vm: AppViewModel = viewModel() TestTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> Column( Modifier .fillMaxSize() .padding(innerPadding) ) { Spacer(Modifier.padding(vertical = 40.dp)) Text( text = vm.aaa.str ) Text( text = "world!" ) Button( onClick = { if(vm.aaa.str != "hello"){ vm.edit("hello") }else{ vm.edit("hi") } } ) { Text("切换") } } } }

当datastore和viewMode结合使用时,需要注意数据有两份,datastore存储一份,viewMode中还有一份,viewMode中的数据不更新则无法触发系统的刷新机制,datastore中的数据不更新则无法将数据持久化。

三、安卓数据方案的总结

1.对于datastore本地化数据解决方案,和远程数据解决方案来说,viewMode和mutableState也是存在的,remember则不需要。

2.对于viewModel来说,mutableState是存在的,remember不需要。

3.对于remember来说,mutableState是存在的。

http://www.jsqmd.com/news/1076437/

相关文章:

  • Social Analyzer开源情报分析实战指南:高效追踪数字足迹的终极方案
  • 后量子密码学实战指南:从NIST标准到企业迁移路径
  • 软件矩阵图管理化的因素关系
  • Selenium IDE:从零掌握Web自动化测试的录制回放与脚本优化
  • 菜单栏开发:实现顶部原生菜单栏(MenuBar)(77)
  • Python的多进程居然把我坑惨了!别踩这个坑
  • 3步快速解决Jellyfin中文影视刮削难题:MetaShark完整配置教程
  • 别再瞎找了!盘点2026年万众偏爱的的AI论文平台
  • 致远FE平台apprvaddNew接口SQL注入漏洞挖掘与防御实践
  • Detecting hallucinations in large language models using semantic entropy
  • AI离题(Digression)识别与防御实战指南
  • PDF转Word教程:3款免费在线工具实测(支持OCR识别与批量转换)
  • 如何在家中搭建游戏串流服务器?Sunshine让你随时随地畅玩PC游戏
  • 聚类实战指南:从无监督学习到业务可解释的工程落地
  • 从产品设计角度看「适趣古诗词」的分级与复习机制
  • 利用LPCUSBSIO库实现免驱USB转I2C通信:跨平台开发与实战指南
  • 泛微e-Bridge任意文件上传漏洞深度剖析与安全防御实践
  • LCS4110R—为您的智能设备赋予金融级的安全防护
  • 什么是 OpenAI Codex?
  • 如何高效使用Ryujinx:免费开源的Nintendo Switch模拟器完整指南
  • Log4j2漏洞深度解析:从JNDI注入原理到企业级应急响应实战
  • 思源宋体终极指南:如何在5分钟内免费获得专业级中文字体
  • ALINX 慕尼黑上海电子展邀请函|免费咖啡、特斯拉香薰、定制周边+千元板卡大奖等你来拿!​
  • 边缘计算场景下的时序数据库选型:TDengine 边缘版实战
  • 面向 MQL4 / MQL5 策略代码的 AI 辅助生成与编译校验工作流实践
  • 从CVE-2024-0517与CVE-2024-6507看Chrome RCE漏洞的攻防实战
  • 从线性回归到Transformer:统计视角下的条件概率建模演进
  • Make-a-Video实战指南:文本生成视频的原理、调优与工作流集成
  • 私域电商系统避坑指南
  • 神经酸PS-DHA脑力工作者的营养真相