Kotlin
bro*_*oot 7
StateFlow仅在检测到值更改时发出,它忽略用相同数据替换值。为此,它将先前的值与新的值进行比较。出于这个原因,我们不应该修改我们已经提供给 的数据StateFlow,因为它无法检测到更改。
例如,我们设置value为User(name=John). 然后我们通过修改相同的用户对象来改变它name,James并将其设置value为这个“新”用户对象。StateFlow将 "new"User(name=James)与其存储的值(现在也是)进行比较User(name=James),因此它看不到任何变化。
在您的示例中,您创建了 的副本UserStateModel,但在内部您重复使用相同的对象并改变它们。在这种情况下,您添加了一个新项目,tags并且此更改也影响了旧项目UserStateModel,因此StateFlow不会检测到更改。
要解决此问题,您需要复制所有已更改的数据,并且不要在原地更改任何内容。使所有数据不可变更安全,因此val-List这样您就被迫进行复制。我更改tags为val tags: List<Tag> = listOf(),那么您的代码可能如下所示:
val posts = userStateFlow.value?.posts!!.toMutableList()posts[index] = posts[index].copy(tags = posts[index].tags + myNewTag)userStateFlow.value = userStateFlow.value?.copy(posts = posts)在这里,我们不仅创建了UserStateModel. 我们还复制posts了我们修改的列表,Post我们还复制了标签列表。
或者,如果这种行为对StateFlow您来说更烦人而不是有用,您可以使用SharedFlowwhich 不比较值,而只是发出。
Kotlin