Composable在viewmodel中mutablestatflow时不更新



我有Viewmodel,我保持引用后。当我想翻译后,我运行函数更新状态流和post,如果我把日志在那里,我看到的值被改变,但我的组合没有得到任何新的值。下面是viewmodel中执行这个神奇的

的部分代码

private var originalText = tile.text?.originalText
private var text = tile.text?.text
private var _postTileState = MutableStateFlow(tile)
val tileState = _postTileState.asStateFlow()
fun translateText() {
val newText = if (_postTileState.value.text?.isTranslated == true)
originalText
else text
val postText = PostText(
text = newText,
isTranslated = !_postTileState.value.text?.isTranslated!!,
originalText = tile.text?.originalText
)
_postTileState.value.text = postText
}

瓷砖是一个帖子。这是父母可组合

@Composable
fun PostTileView(
tile: PostTile,
content: @Composable (
tile: PostTile,
) -> Unit
) {
val postTileViewModel = postTileViewModel(
tile,
id = tile.id
)
val postTile = postTileViewModel.tileState.collectAsState().value
Column(
modifier = Modifier
.background(Style.colors.content)
.padding(bottom = 10.dp)
) {
PostTileHeaderView(postTile.author, createdDate = postTile.createdDate)
content(postTile)
if(postTile.text?.originalText != null) {
Button(onClick = {
postTileViewModel.translateText()
}) {
val buttonTitle = if(postTile.text!!.isTranslated == true)
"Show original" else "Translate"
Text(text = buttonTitle)
}
}
PostTags(tags = postTile.tags)
}
}

如果我把一些其他的状态与这一个在视图模型,如一些布尔值,并得到参考它在可组合的工作很好,但更新后,它不工作。我错过了什么?

问题是你的translateText()函数,你不能像_postTileState.value.text = postText一样在状态流中更新对象的单个变量,而是你需要更新hole对象,所以你的函数应该是这样的:

fun translateText() {
val newText = if (_postTileState.value.text?.isTranslated == true)
originalText
else text
val postText = PostText(
text = newText,
isTranslated = !_postTileState.value.text?.isTranslated!!,
originalText = tile.text?.originalText
)
_postTileState.value = _postTileState.value.copy(text = postText)
}

现在状态流将注意到您设置了一个新对象。

最新更新