【发布时间】:2022-02-08 23:21:15
【问题描述】:
注意 - 这个问题和this one差不多。
如果有的话,我正在寻找更好的方法。
根据Android Docs,
一旦显示瞬态消息,用户界面需要通知 ViewModel 导致另一个 UI 状态更新:
例如,当我在单击按钮时显示 Toast 消息时,UI 是否应该通知 ViewModel 成功显示 Toast?
这是处理吐司、小吃店等一次性操作的最佳方法吗?
示例代码,
@Composable
fun OneShotOperation(
viewmodel: OneShotOperationViewModel = viewModel(),
) {
val context = LocalContext.current
LaunchedEffect(
key1 = viewmodel.toastMessage,
) {
if (viewmodel.toastMessage.isNotBlank()) {
Toast.makeText(
context,
viewmodel.toastMessage,
Toast.LENGTH_SHORT,
).show()
viewmodel.toastMessage = "" // Is this the correct way?
}
}
Button(
onClick = {
viewmodel.toastMessage = "Sample Toast"
},
) {
Text(text = "Show Toast")
}
}
class OneShotOperationViewModel : ViewModel() {
var toastMessage by mutableStateOf(
value = "",
)
}
如果我删除此行,viewmodel.toastMessage = "" // Is this the correct way?
toast 只显示一次,随后按下按钮不会显示 toast,因为可变状态没有改变。
【问题讨论】:
-
如果您删除 viewmodel.toastMessage = "" 您将无法再次显示相同的消息。而不是修改视图模型的属性,它应该调用适当的方法,你需要在你的视图模型中使用 fun toastShown() {toastMessage = ""} 之类的东西。
标签: android android-jetpack-compose