据我所知,与任何状态相关的代码的每一部分都将随着状态的变化而改变(重新组合(→
每个状态都是可观察的,依赖的UI部分观察该状态并订阅它(状态(,每当状态发生变化时,它都会被通知(重新绘制UI的该部分(并进行重新组合。
但在谷歌Thinking in composite的这篇文章中,它说composition是随着输入的变化而发生的,所以我很困惑。
重新编译是在输入发生变化时再次调用可组合函数的过程。当函数的输入发生变化时,就会发生这种情况。当Compose根据新的输入重新组合时,它只调用可能已经更改的函数或lambda,并跳过其余的。通过跳过所有没有更改参数的函数或Lambda,Compose可以有效地重新组合。
此外,在撰写路线图的其他示例中,鼓励提升状态,使可撰写函数成为无状态,以避免的重新计算
所以,如果有人能清楚地表明,重新计算只发生在状态变化或输入变化也引起的情况下,那就太好了?
提前感谢您对的帮助
当参数值更改或可组合函数中的可变状态变量更新时,会发生重新部署。
一种无状态函数,有时被称为";不可变的";函数中没有存储任何数据。这意味着,如果您重复调用该函数,它将与您第一次调用它时相同。每次调用函数时,该函数都不会保留任何变量的内存。
提升可组合的状态意味着状态变量保持在可组合之外,并且这些状态变量的值作为正常参数传递到可组合中。这允许您重复使用可堆肥的。如果您正在创建一个可组合的库,希望从一个项目重用到另一个项目,这一点尤为重要。可以向库的用户保证,不存在可组合程序所需的状态依赖关系。如果你想要一个真正的无状态可组合,你应该避免做传递视图模型之类的事情。视图模型在很大程度上取决于它所在的应用程序,并且其中会有非常特定于该应用程序的代码。无状态可组合程序对应用程序没有依赖关系,因此可以在其他地方重用。
这并不意味着您不能在可组合文件中使用视图模型。起初,当Compose刚问世时,谷歌对此表示反对,但意识到这对开发人员来说非常尴尬。如果开发人员没有理由在屏幕外制作一个可重复使用的可组合程序,那么提升每个可组合程序的状态就会变得很痛苦,从而产生不必要的样板代码。因此,一般规则是,如果您的可组合文件不会在其他地方重复使用,并且您需要访问视图模型数据,您可以将视图模型作为参数传入,也可以通过其他方式在可组合文件中访问它。
除了视图模型之外,您可能仍然希望使一个可组合的有状态,即使它需要重用。一个很好的例子是,如果您使用的是TextField。当您输入文本时,您希望文本显示出来。如果不使用状态变量来保留键入的字符,则不会看到TextField更新。因此,使用本地状态变量来存储输入的字符是可以接受的。虽然这并不能使可组合成为无状态的,但它仍然是您需要实现的。然而,即使在本例中,您仍然可以通过将键入的字符返回到提升函数并将其存储在视图模型状态变量中,从而触发提升函数重新组合可组合并传入TextField所需的文本,使其成为无状态。但这相当复杂,只是为了在TextField中显示字符,这是一次巨大的往返旅行,因此不建议这样做。不过,如果您有一个非常复杂的可组合TextField,并且您需要在键入视图模型中的字符时对其进行处理,则您可能需要这样做,例如对url进行建议查找。
因此,即使您的compositable是无状态的,但您的视图模型有一个可变状态变量,而提升函数正在观察该变量,如果该变量的可变状态发生变化,则提升函数将重新组合。但是,提升的可组合调用的可组合是否得到重新组合取决于该可组合的参数值是否发生变化。如果它们发生变化,就会发生重组。