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

初始化数据的正确方式?

关于这篇文章

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 = true
            delay(5000)
            _isLoading.value =false
        }
    }

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


http://www.kler.cn/news/341290.html

相关文章:

  • 计算机毕业设计 基于Python音乐平台的设计与实现 Python毕业设计 Python毕业设计选题 Vue 前后端分离【附源码+安装调试】
  • B端系统推荐使用UI框架,但是核心页面还是要设计的
  • 搭建一个普通的网站需要多少费用?
  • 等保测评与ISO 27001:融合构建全面网络安全管理体系
  • jdk 11.0.8 配置 classpath
  • go发送邮件:在Go语言中实现发邮件的教程?
  • ProteinMPNN数据输入主要函数介绍
  • 【SEO】什么是SEO?
  • Vue.js 过渡 动画
  • Rocky Linux 9搭建K8s-1.28.0+docker一主多从集群测试环境
  • 【算法刷题指南】BFS解决FloodFill算法
  • 云数据库价格贵吗?云数据库租用价格表
  • NFT 是什么?
  • 服务端口的查看和释放
  • CIME2025深圳国际热管理材料与设备展览会(宝安新馆|2025年6月25-27日)
  • charAt,chartCodeAt,codePointAt,fromCodePoint,fromCharCode
  • mac本地VSCode配置LeetCode
  • 处理“navicat premium 2003 - 无法在 192.168.10.140 上连接到 MySQL 服务器(10060“未知错误“)”的问题:
  • 2024年华为OD机试真题-空栈压数-Python-OD统一考试(E卷)
  • Java中的JDBC操作详解、JDBC工具类的编写以及DBUtils工具包的使用