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

初始化数据的正确方式?

关于这篇文章

https://proandroiddev.com/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62

pl的视频解读

当在viewmodel中需要进行数据的初始化的时候 viewmodel.initData()

放在哪里合适呢,大部分情况下可以放在 viewmodel的init{}模块,但是这样无法指定初始化的时机。

也有人选择在compose的 launchEffect的时候,但是在launcheffect的时候,基本如果界面重新初始化,例如界面旋转这样,那么初始化的数据就会重新又运行一次。

然后就有人指出在demoproject里面的一段代码

val pokemon = savedStateHandle.getStateFlow<Pokemon?>("pokemon", null)
val pokemonInfo: StateFlow<PokemonInfo?> =pokemon.filterNotNull().flatMapLatest { pokemon ->detailsRepository.fetchPokemonInfo(..)}.stateIn(scope = viewModelScope,started = SharingStarted.WhileSubscribed(5_000),initialValue = null,)

当存在一个冷流(cold flow)提供一些状态值的更新,且这个冷流的创建和/或维护成本很高,但有多个订阅者需要获取最新的状态值。例如,假设状态更新是通过耗费较大成本的网络连接从后端获取的,且需要很长时间来建立连接。

这样我们可以将之前从网络后端费了好大劲获取的pokemonInfo的值

缓存起来,从开始订阅的时候就缓存了,然后直到都没有订阅者了,再过5秒后就清除,如果五秒内重新有订阅者,则不会再去调用后端获取值,而是使用之前缓存的值,如果五秒后,都没有订阅者,当有订阅者重新订阅了,则这个时候,就要重新获取了。

所以在pl的视频后,给出了一种初始化数据的方式就是

 private val _isLoading = MutableStateFlow(false)val isLoading = _isLoading.onStart { //在开始的时候initLoadData()//}.stateIn(viewModelScope,SharingStarted.WhileSubscribed(5000L),//确保没有订阅者之后,还可以缓存5秒false)fun initLoadData(){println("start loading data....")viewModelScope.launch {_isLoading.value = truedelay(5000)_isLoading.value =false}}

这样,即便是屏幕旋转,肯定也是再五秒内完成,所以不会造成数据的重新加载

http://www.lryc.cn/news/456249.html

相关文章:

  • Flutter平台嵌入器
  • 微信小程序——婚礼邀请函
  • WebRTC Connection Negotiate解决
  • Redis面试篇1
  • Debezium系列之:Debezium 3.0.0.Final发布
  • 一文解决jQuery表格插件DataTable导出PDF中文乱码问题
  • 使用pytorch进行迁移学习的两个步骤
  • ChatGPT相关参数示例
  • OWASP发布大模型安全风险与应对策略(QA测试重点关注)
  • 【HarmonyOS开发笔记 2 】 -- ArkTS语法中的变量与常量
  • UI自动化测试示例:python+pytest+selenium+allure
  • C/C++ 编程小工具
  • 第四十二章 使用 WS-ReliableMessaging
  • 利士策分享,婚姻为何被称为大事?
  • malloc源码分析之 ----- 你想要啥chunk
  • 软考系统分析师知识点五:数据通信与计算机网络
  • windows客户端SSH连接ubuntu/linux服务器,三种网络连接:局域网,内网穿透(sakuraftp),虚拟局域网(zerotier)
  • Python 工具库每日推荐【openpyxl 】
  • 本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?
  • ML 系列:【13 】— Logistic 回归(第 2 部分)
  • 45岁被裁员的程序员,何去何从?
  • 云计算Openstack Neutron
  • PointNet++网络详解
  • Java | Leetcode Java题解之第459题重复的子字符串
  • 【动态规划-最长公共子序列(LCS)】【hard】力扣1092. 最短公共超序列
  • ‌图片编辑为底片,智能工具助力,创作精彩视觉作品
  • 机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
  • 回溯算法之值子集和问题详细解读(附带Java代码解读)
  • mysql游标的使用
  • linux udev详解