在jetpack compose中,我们可以使用collectAsState()
将MutableStateFlow<T>
转换为State<T>
,并且通过委托by
可以直接将T
分配给变量。
现在,据我所知,如果我使用MutableState<T>
或MutableStateFlow<T>
来保存状态,性能方面并不重要。但是对于List类型,似乎没有特殊版本的Flow,即,如果你真的需要,你可以使用Flow<List<T>
,我已经看到使用了大部分时间。然后,如果你在Flow<List<T>
上应用collectAsState()
,你会得到State<List<T>
。
现在,如果我理解正确的话,即使单个值被更改在列表中添加(添加、移除、修改)的列表项UI组件,整个列表状态将被认为是新的,因此 * 所有 * 相应的列表项UI组件将被重新组合。或者,Jetpack compose对State<List<T>
有一些内部优化,可以防止这些类型的无用重组,我不应该担心它。
1条答案
按热度按时间vsmadaxz1#
根据我的测试,LazyColumn将不重组项目,只要你提供的关键,即使它是从
State<List<T>
。我的测试样本:
在这里,
Modifier.animateItemPlacement()
只有在确保key
唯一而不是位置的情况下才有效。key
本身确保同一项不会重新组合。https://stackoverflow.com/a/70596559/13519865https://stackoverflow.com/a/68794279/13519865
最后,
animateItemPlacement
工作,因此密钥使用得很好。因此,我们可以放心地假设,我们可以使用
State<List<T>
来获得它的Flow操作优势,而无需过多考虑重组成本。