【发布时间】:2021-11-17 13:14:33
【问题描述】:
鉴于我有多个可以触发小吃店的地方,我希望在我的应用中有一个中心位置,我可以在其中处理显示/关闭小吃店。
这是我的应用程序的结构:
我已经实现了一个包含 StateFlow 的 BaseViewModel,它应该跟踪 SnackBar 消息(所有其他 ViewModel 都继承自这个 BaseViewModel):
@HiltViewModel
open class BaseViewModel @Inject constructor() : ViewModel() {
val _snackBarMessage = MutableStateFlow("")
val snackBarMessage: StateFlow<String> = _snackBarMessage
}
为了测试 StateFlow 的更新是否正确触发,我实现了一条消息,应该在每次登录后更新 StateFlow:
private fun setSnackBarMessage() {
_snackBarMessage.value = "A wild snackBar appeared"
}
MainContent 包含我的 Scaffold(包括scaffoldState、snackbarHost),应该对snackBarMessage 流中的变化做出反应,并在需要时显示/关闭 Snackbar:
fun MainContent(...){
val message by viewModel.snackBarMessage.collectAsState()
LaunchedEffect(message) {
if (message.isNotEmpty() Timber.d("We got a snackbar")
}
Scaffold(...){...}
}
在调试过程中,我注意到每次登录后,snackBarMessage 值都会正确更新,但 MainContent 没有得到这些更新,这反过来意味着,snackbar 永远不会显示。
MainContent 没有从 LoginComposable 获取这些更新是否有原因? 是否有可能有一个小吃店的中心实例,或者我真的需要在每个 Composable 中单独处理小吃店?
【问题讨论】:
标签: android kotlin android-jetpack-compose android-snackbar