您可能会造成您的状态错误!- 喷气背包组成
不要在Jetpack/Jetbrain组成的状态错误 - 国家破坏与州代表的情况下。
出现在:DroidCon|Proandroiddev|libhunt|Androidweekly|普通软件|Androidstack|Kotlintrend
有两种方法可以在JetPack/Jetbrain组成中创建可变状态。首先,我最喜欢的方法是使用破坏性
另一种方法是使用代表
。
破坏性状态
如果您不知道在Kotlin中破坏的概念,请从这里了解所有有关它们的信息:
如果你看mutableState签名:
它有组件1
和组件2
操作员的意思是,它可能会破坏:
val(count,setCount)= mutableStateOf(0)
在哪里数数
从中获得价值组件1
和setCount
是一个来自组件2
。
与代表的可变状态
从官方渠道学习代表:
https://kotlinlang.org/docs/delegated-properties.html
如果您查看状态和可变状态文档:
getValue(...)
被定义了状态
和设定值(...)
被定义了mutablestate
,因此我们可以在IT示例上使用委托的概念:
我们通过定义在状态下控制和写作瓦尔
要么var
变量的参考类型。
我个人认为破坏性
方式对我来说更可读性和可维护,因为我知道通过跟踪的设定操作发生了什么setCount()
,以及通过跟踪进行操作发生的地方数数
。虽然跟踪由代表创建的状态您会很难,但根据我的经验,我感到很困难var
最终很容易被开发人员利用。
同样,在我将状态转发给儿童可组合的情况下,我不必创建就地的lambdas,我可以直接传递参考文献,例如:
好吧,直到现在,我一直是破坏可变状态的粉丝,但是最近我遇到了一个方案,这使我对这种方法引起了人们的关注。
考虑以下代码,当单击按钮并在UI上显示它时,我将按1增加一个。
输出 :
我想更新摘要以增加2而不是1,请参阅我所做的以下更改:
输出 :
WTF - 它不起作用!
Let’s Investigate why?
当您单击按钮时,以下是背景中发生的事情:
但为什么???setCount()
应该是可变状态的吗?
什么破裂了?它是构成还是突变?:
好吧,没有人打破。我深入研究了发生的事情,我发现:
- 撰写内部观察所有读物和文字要陈述,我们不需要了解内在的讨论工作,但是您只需要知道在快照系统上撰写作品,您对可变状态效应的所有写作此快照。
- 如果以前和新快照之间存在冲突,那么解决冲突将发生一些措施。就撰写框架而言,这将导致重新组合的触发因素。
- 因此,当更新可变状态值时,它将检查快照策略并验证快照是否有任何冲突,
- 如果答案是肯定的,那么可变状态将告知作曲词以重新组合和存储最新值,但没有使最新值成为直接的状态价值,而是将其设置为下一个重组周期的候选值从。
- 因此,即使您完成了多个状态更新,您设置的最后一个值也将被视为状态值的最新候选人。
- 当重新组件发生时,它会读取可变状态的最新值并应用更改。
♂️Okay…这是否意味着我们必须等到候选价值变为真正的价值,即直到重新分配才能更新状态?即,在撰写中进行多个设置状态操作是错误的???
好吧,在大多数情况下,如果我们创建一个情况,我们可以避免这种情况启动效果
并将我们的状态更改逻辑纳入其中或对我们的逻辑进行重构以创建一个集合状态。
但是理想情况下,这不是我们更新状态的期望的行为。
让我们使用委托模式查看相同的代码:
输出 :
该片段可以正确执行操作!。为什么发生这种情况?没有适用于行为的规则吗?
好吧!通过破坏端子创建状态与委托创建状态
内部相同的事情已经发生了,但是当您使用状态委托法时,每当您从状态阅读一个值时,都会委派进行操作mutableState.value
,将返回候选值而不是实际值(如果快照ID已更改)。
但是,当您处理破坏状态时,组件1
只打了电话mutableState.value
只有一次破坏并将其设置为数数
可变,即getter部分。如果您再次从Getter阅读它,它将不会将任务委派给mutableState.value
检查并获取候选值,它将在去结构时返回最后一个计算值。
这意味着在使用破坏性时,您的书面代码类似于:
因此,您必须等待重新分配以重新定位可变状态的价值。
因此,实际上,没有构成或突变的行为被打破,这只是在语言中破坏和委派工作的方式。
结论♀️
虽然我仍然觉得破坏性
比更好委派
声明,但要与一致的状态价值合作,最好与委派道路相处。
感谢您阅读这篇文章。如果您喜欢我的文章,请查看更多我的文章和内容https://chetangupta.net/
如果您想让我写文章或训练您的业务的Android团队,则可以通过单击来伸出援手这里。
直到下一次!快乐的黑客
P.S.如果您喜欢这篇文章别忘了拍手如果您是粉丝或想支持我的内容,则确实考虑丢弃提示/咖啡/捐赠这里