专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

KotlinFlow常用封装类StateFlow的使用

  Kotlin中StateFlow的使用
  StateFlow是Flow的实现,是一个特殊的流,默认的Flow是冷流,而StateFlow是热流,和LiveData比较类似。关于冷热流后面一期SharedFlow会详细说明。
  使用StateFlow替代LiveData应该是目前很多开发者的呼吁了,确实LiveData的功能StateFlow都能实现,可以说是LiveData的升级版。
  StateFlow的特点它始终是有值的。它的值是唯一的。它允许被多个观察者共用(因此是共享的数据流)。它永远只会把最新的值重现给订阅者,这与活跃观察者的数量是无关的。
  官方推荐当暴露UI的状态给视图时,应该使用StateFlow。这是一种安全和高效的观察者,专门用于容纳UI状态。一、StateFlow的使用
  方式一,我们自己new出来
  一般我们再ViewModel中定义读写分类的StateFlowHiltViewModelclassDemo4ViewModelInjectconstructor(valsavedState:SavedStateHandle):BaseViewModel(){privatevalsearchFlowMutableStateFlow()valsearchFlow:StateFlowStringsearchFlowfunchangeSearch(keyword:String){searchFlow。valuekeyword}}
  在Activity中我们就可以像类似LiveData一样的使用StateFlowprivatefuntestflow(){mViewModel。changeSearch(key)}overridefunstartObserve(){lifecycleScope。launchWhenCreated{mViewModel。searchFlow。collect{YYLogUtils。w(valueit)}}}
  方式二,通过一个冷流Flow转换为StateFlowvalstateFlowflowOf(1,2,3)。stateIn(scopelifecycleScope,startedWhileSubscribed(5000,1000),startedEagerly,startedLazily,initialValue1)lifecycleScope。launch{stateFlow。collect{}}
  几个重要参数的说明如下scope共享开始时所在的协程作用域范围started控制共享的开始和结束的策略Lazily:当首个订阅者出现时开始,在scope指定的作用域被结束时终止。Eagerly:立即开始,而在scope指定的作用域被结束时终止。WhileSubscribed能够指定当前不有订阅者后,多少时间取消上游数据和能够指定多少时间后,缓存中的数据被丢失,回复称initialValue的值。initialValue初始值二、替代LiveData
  不管是普通的ViewModel观察订阅模式,在Activity中订阅,还是DataBinding的模式,我们都可以使用StateFlow来代替ViewModelvalwithdrawMethodMutableStateFlow(0)ImageViewandroid:ididivgirocheckedandroid:layoutwidthwrapcontentandroid:layoutheightwrapcontentandroid:layoutmarginRightdimend15dpandroid:srcdrawablepaymethodcheckedandroid:visibilitygonebinding:isVisibleGone{viewModel。withdrawMethod1}
  为什么我们需要用StateFlow来代替LiveData,或者说LiveData有什么缺点?
  LiveDatavsFlow
  先上代码,看看它们的用法与差异
  ViewModel的代码HiltViewModelclassDemo4ViewModelInjectconstructor(valsavedState:SavedStateHandle):BaseViewModel(){privatevalsearchLDMutableLiveDataString()valsearchLD:LiveDataStringsearchLDprivatevalsearchFlowMutableStateFlow()valsearchFlow:StateFlowStringsearchFlowfunchangeSearch(keyword:String){searchFlow。valuekeywordsearchLD。valuekeyword}}
  Activity中触发与接收事件privatefuntestflow(){mViewModel。changeSearch(key)}overridefunstartObserve(){mViewModel。searchLD。observe(this){YYLogUtils。w(valueit)}lifecycleScope。launchWhenCreated{mViewModel。searchFlow。collect{YYLogUtils。w(valueit)}}}
  可以看到基本的使用几乎是没有差异,在DataBinding中同样的是都能使用。那么它们有哪些差异呢?
  它们相同的地方:仅持有单个且最新的数据自动取消订阅提供可读可写和仅可读两个版本收缩权限配合DataBinding实现双向绑定
  相比StateFlow,LiveData的确定:LiveData在某些特定的场景下会丢失数据LiveData只能在主线程不能方便地支持异步化LiveData的数据变换能力远远不如FlowLiveData粘性问题解决需要额外扩展LiveData多数据源的合流能力远远不如FlowLiveData默认不支持防抖,值没有变化也会通知
  这么惨,那我们开发是不是要放弃LiveData了?
  恰恰不是!
  如果大家全部是Koltin代码开发,那么是可以用Flow,这是基于Kotlin代码,基于协程实现的,但是现在很多项目还是Java语言开发的。那么LiveData还是很香的。
  其二是LiveData的学习成本与协程、Flow的学习成本不可同日而语,开发项目是整个团队的事情,不能说你一个人会一个人用,目前LiveData的简单学习成本是很有优势的。
  只是我们需要在一些特定的场景慎重使用postValue,比如数据比较秘籍的场景,我们尽量使用setValue方法。总结
  如果大家的项目的语言是Kotlin,并且小组成员都会Flow。那么我推荐你们使用StateFlow替代LiveData。如果不是,那么LiveData是你最好的选择。
  谷歌也只是推荐使用Flow替代LiveData。但是并没有说打算放弃LiveData。并且LiveData与StateFlow都有各自的使用场景,不需要担心LiveData的使用。
  本文我们只是简单的对比,关于StateFlow与SharedFlow和LiveData三者的差异与选择,后面等SharedFlow那一期详细的讲解。
  为什么很多东西都要等SharedFlow,是因为SharedFlow是StateFlow的基础,StateFlow像是SharedFlow的‘青春版’。很多东西需要讲完SharedFlow才能把知识点串起来,期待一下。
  作者:newki
  链接:https:juejin。cnpost7127082531358244900

很多人都缺乏这五大营养,收好这几张食物表格,照着吃就对了一日三餐可以保证吃得饱,但却不一定能吃得好。成年人钙维生素AB等部分营养素缺乏依然存在。很多人都缺乏这五大营养!1。钙2。核黄素(维生素B2)3。硫胺素(维生素B1)4。维生素C5杨培东的伟大成就研发人工光合作用,让二氧化碳变成汽油药品综述当今的科学技术发展,最看重的就是使用价值,一个研究到底是不是好的,绝大部分要看它在实际应用中的表现。而另外一点,就是要看它的应用方式。就目前的全球能源形势来说,一切新的发明都至高血压就怕缺钾,长期吃降压药,建议平时多补充4种高钾食物高血压是指以体循环动脉血压(收缩压和或舒张压)增高为主要特征(收缩压140毫米汞柱,舒张压90毫米汞柱),可伴有心脑肾等器官的功能或器质性损害的临床综合征。高血压是最常见的慢性病,抓住春天长高的黄金期!多吃这5种食物,孩子长得快,美味春天万物生长,孩子的身高也在此刻猛窜长。这个时候家长都会开始有意识地给孩子合理搭配饮食,以多样的营养刺激孩子的生长,帮助孩子全面的成长。想给孩子补营养,多吃这5种食物,营养美味又健开局挖大坑!山西170打懵辽宁赵继伟疯狂救主西蒙斯让杨鸣头疼4528,山西队在和辽宁队的第二节比赛当中曾一度落后对手17分,这样的局面出乎了所有球迷的意料,虽然辽宁队已经做好了山西队全面反扑的准备,但是没想到山西队不仅在防守端极具侵略性,进炒花蛤,切记别直接焯水,老渔民教你1招,鲜嫩入味干净无沙4月已至,天空升起的太阳,不再伴随着侵入骨子里的冷风,我们也开始脱出了厚重的外衣,又可以重新穿上美美的裙子。或许很多朋友和青青一样,到了夏天都会带上自己的好朋友或家人去海边,感受大干预生活方式预防慢性病是预防阿尔茨海默病的重要方法!日前,柳叶刀国际痴呆症预防干预和护理委员会公布,全球超过13的痴呆,可通过干预危险因素的方法预防。那么,防治阿尔茨海默病都有哪些建议?我们从干预生活方式和预防老年慢性病两个角度来说孩子沉迷游戏怎么办?这不是打一顿就能解决的问题我也是个爱打游戏的人。从梦幻西游(暴露年龄啊)开始,魔兽世界到现在的王者农药。只能庆幸自己的初中或是高中阶段没有这些游戏,否则真的不知道自己现在在哪个地方混呢。于是有人说,真怀念小人民日报停止精神内耗的9个好习惯(建议收藏)知乎上有个问题一个人活得很累的根源是什么?高赞回答说不是能力问题,不是外貌问题,而是没能处理好与自己的关系。确实,很多时候,人之所以感到痛苦,不在于事情本身,而在于我们内心的冲突。国产手机发展到今天,为何没有以前的势头猛?专家缺乏性价比华为被打压之后,国产品牌再一次被推到了风口浪尖,让西方国家都看到了这个来自中国的品牌拥有如此顽强的毅力,受到老美举国之力打压依旧没有倒下,反而唤醒了一家有一家的中国厂商走上研发之路期待!CBA高诗岩对下家提出3个要求仅1家满足杨鸣不一定会成全目前CBA季后赛正在激烈地进行中,目前8进4的赛程也即将过半,刚刚结束的比赛中,卫冕冠军广东男篮击败了浙江男篮成功进入了四强,接下来他将等待辽宁男篮和山西男篮的胜利者,不出意外,广
辽宁队战胜广东队,杨鸣一番话说得杜锋很感动,杨鸣情商真高辽宁队战胜广东队,杨鸣一番话说得杜锋很感动,杨鸣情商真高辽宁男篮经过加时赛的鏖战,以117比116险胜广东男篮,对辽篮来说,这是一场有惊无险的比赛,没想到广东男篮第三场会打得这么好辽宁男篮球员年薪公布,郭艾伦韩德君顶薪,张振麟竟是童工合同郭艾伦800万(D类顶薪)韩德君800万(D类顶薪)赵继伟400万(C类常规)李晓旭300万(C类常规)刘志轩200万(C类常规)郭旭150万(老合同)丛明晨50万(C类常规)张镇8倍镜还原赵继伟受伤真相,曾繁日使黑脚踢其裆部,裁判就在一旁八倍镜还原赵继伟受伤真相,曾繁日使黑脚踢其裆部,裁判置之不理。CBA半决赛粤辽大战终于正式落下帷幕,最终辽宁队以总比分30横扫广东队晋级决赛,总决赛的对手将会是广厦队和上海队的胜者许婧被前夫陈赫伤透了心,如今收获幸福,和国外男友恩爱甜蜜对不起,对不起,我向所有人隐瞒了我离婚的事。我和许婧签署离婚协议已经快半年了,我们是和平分手的,没有任何其他事情。求大家不要去打扰她,给他一个私人空间,她不是这个圈子的人。2015跑男开录,白鹿呼声高成新宠儿!网友预测热巴时期来了文淘子第十季跑男已经开始录制了。从第一期的嘉宾阵容上来看,节目组也是费了不少心思。除了之前的固定嘉宾外,白鹿和周深的加入已然成为一个热点话题,尤其是在白鹿这边,好多观众都对她好评不TFBOYS组合八周年了,易烊千玺王俊凯王源变化好大2014年4月15日,TFBOYS组合在第二届音悦V榜年度盛典获得了音悦直播人气歌手内地最具人气歌手两个奖项。这是他们第一次站在大众面前,拿到奖杯。8年后的今天,他们已经在各个领域世界顶级音响旗舰型号之KEFMUONKEF旗舰级高保真扬声器MUON(介子)是形式和功能伟大结合的胜利,它也许是有史以来最非凡的扬声器。MUON是KEF的工程实力与RossLovegrove的世界级工业设计相结合的结不去西藏,怎能领略世界之美?有人说,这里是人间仙境也有人说,这里就是世外桃源也有很多人,梦想着,在这样的人间天堂终老这里就是西藏摄影师卢海林去西藏去看醉美林芝的灼灼桃花摄影师西藏张静摄影师弥藏达娃摄影师弥藏达广东打了一场虽败犹荣的精彩比赛,辽宁,总决赛见首先感谢广东和辽宁给大家奉献的一场精彩的比赛。比赛真是精彩激烈,跌宕起伏,这才是季后赛,这才是半决赛,说真的最近几场不管是广厦和上海,还是广东辽宁的前两场,都没有这一场精彩。首先广奥沙利文再惹争议,发声嘲讽世界冠军你不在那个讨论中,伙计近日,斯诺克传奇球星奥沙利文有点忙。作为斯诺克年度最重要赛事之一世界锦标赛的种子选手,夺冠热门球员,奥沙利文要将部分精力放在比赛中。但比赛对于奥沙利文来说,并不是全部。近日,他的斯都把头抬起来!鹈鹕主帅超燃演讲导演末节逆转北京时间4月16日,鹈鹕105比101击败快船锁定西部第八进入季后赛,鹈鹕主帅威利格林在末节开始前上演了极富激情的演讲,这也是鹈鹕反败为胜的关键之一。三节过后,快船84比74领先,
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网