uiState 中的喷气背包组成更改不会触发重组



我想我还没有完全理解撰写状态是如何工作的。当状态中的项发生变化时,我无法触发重组。

我正在构建一个需要通知访问的应用程序,因此我正在将用户导航到设置,在用户授予权限后,他们必须导航回应用程序。这就是我想触发重组的地方。

我有权限检查在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)。撰写不跟踪内部字段的更改。这里有两个选项:

  1. 修改setupustatate作为一个整体,假设你在你的ViewModel中使用StateFlow,它看起来像这样:
    fun setHasNotificationPermission(value: Boolean) {
    uiState.update { it.copy(hasNotificationPermission = value) }
    }
    
    你也应该把hasNotificationPermission从var改成val。
  2. 你可以使用compose的State,这样做:
    class SetupUiState(
    initialHasPermission: Boolean = false
    ) {
    var hasNotificationPermission: Boolean by mutableStateOf(initialHasPermission)
    }
    
    有了这个,你可以简单地做uiState.hasNotificationPermission = value和合成将被通知,因为它会自动跟踪State实例。

相关内容

  • 没有找到相关文章

最新更新