我想我还没有完全理解撰写状态是如何工作的。当状态中的项发生变化时,我无法触发重组。
我正在构建一个需要通知访问的应用程序,因此我正在将用户导航到设置,在用户授予权限后,他们必须导航回应用程序。这就是我想触发重组的地方。
我有权限检查在onResume工作和变量在状态的变化,但重组没有被调用。我遗漏了什么?
可组合
@Composable
private fun MainLayout(viewModel: SetupViewModel){
val uiState = viewModel.uiState.collectAsState()
SetupItem(
title = "Notification access",
summary = if(uiState.value.hasNotificationPermission) stringResource(R.string.granted) else stringResource(R.string.not_granted){}
}
SetupUiState.kt
data class SetupUiState(
var hasNotificationPermission: Boolean = false
)
我知道hasNotificationPermission
被设置为true,但是SetupItem中的摘要没有更新。我该怎么做呢?
这里的问题是hasNotificationPermission
字段是可变的(var
而不是val
)。撰写不跟踪内部字段的更改。这里有两个选项:
- 修改setupustatate作为一个整体,假设你在你的ViewModel中使用StateFlow,它看起来像这样:
你也应该把fun setHasNotificationPermission(value: Boolean) { uiState.update { it.copy(hasNotificationPermission = value) } }
hasNotificationPermission
从var改成val。 - 你可以使用compose的
State
,这样做:
有了这个,你可以简单地做class SetupUiState( initialHasPermission: Boolean = false ) { var hasNotificationPermission: Boolean by mutableStateOf(initialHasPermission) }
uiState.hasNotificationPermission = value
和合成将被通知,因为它会自动跟踪State
实例。