成都软件网站开发,昆明建设网站公司,重庆网,盐津铺子网络营销推广方法关于这篇文章
https://proandroiddev.com/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62
pl的视频解读
当在viewmodel中需要进行数据的初始化的时候 viewmodel.initData()
放在哪里合适呢#xff0c;大部分情况下可以放在 viewmodel的init{}模块大部分情况下可以放在 viewmodel的init{}模块但是这样无法指定初始化的时机。
也有人选择在compose的 launchEffect的时候但是在launcheffect的时候基本如果界面重新初始化例如界面旋转这样那么初始化的数据就会重新又运行一次。
然后就有人指出在demoproject里面的一段代码 val pokemon savedStateHandle.getStateFlowPokemon?(pokemon, null)
val pokemonInfo: StateFlowPokemonInfo? 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}} 这样即便是屏幕旋转肯定也是再五秒内完成所以不会造成数据的重新加载