android - Jetpack Compose - 更改 viewModel 中的变量会导致 viewModel 状态发生更改吗?

标签 android kotlin android-jetpack-compose viewmodel

我将描述我的问题,然后提供我的实现。 我有一个带有变量connectionStatus的viewModel,该变量存储跟踪“设备”的connectionStatus的值,并在设备的连接状态发生变化时发生变化。

我在文本可组合项中显示连接状态。 在文本 cmposable 下方,我还有一个按钮“取消连接”,它调用 viewModel 中的 cancelConnection 方法。

问题:每次连接状态发生变化时,conectionStatus 变量都会发生变化,这会导致 Text 可组合项重新组合(这是正常的,预期行为),但它也会导致按钮被重新组合,即使按钮状态没有任何变化。

现在,我认为问题是 connectionState 导致整个 viewModel 的状态发生变化,因为当我删除 Text 可组合项,只留下按钮可组合项时,它仍然是每次更改 connectionStatus 时都会重新组合。

这是我的实现: View 模型:

class ConnectableTopAppBarViewModel(
    private val connectControllerUseCase: ConnectControllerUseCase = ConnectControllerUseCase()
) :
    ViewModel() {

    private val _uiState = MutableStateFlow(ConnectableTopAppBarUiState())
    val uiState: StateFlow<ConnectableTopAppBarUiState>
        get() = _uiState.asStateFlow()

    private val _connectionStatus = mutableStateOf(ConnectionStatus.AWAIT_CONNECTION)
    val connectionStatus get() = _connectionStatus
    
    private var job = Job()
        get() {
            if (field.isCancelled) field = Job()
            return field
        }

    init {
        viewModelScope.launch {
            connectControllerUseCase.getConnectionStatus().collect { newStatus ->
                _connectionStatus.value = newStatus
            }
        }
    }

    fun cancelConnection(deviceIp: String) {
        job.cancel()
        connectControllerUseCase.cancelConnection()
    }
}

现在在我的可组合项中我有这样的东西:

val connectionStatus by viewModel.connectionStatus
...
Text(text = connectionStatus)
...
CustomButton(cancelAction = viewModel::cancelConnection)
...
CustomButton(
    cancelAction = (String) -> ()
) {
    Button(onClick = { cancelAction("test") })
}

我在这里缺少什么?为什么每次 connectionStatus 更改时都要重新组合 CustomButton?即使我正在传递方法引用。

最佳答案

尝试:

CustomButton(cancelAction = remember { viewModel::cancelConnection } )

关于android - Jetpack Compose - 更改 viewModel 中的变量会导致 viewModel 状态发生更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75904815/

相关文章:

android - 调用 ActionBarDrawerToggle.setDrawerIndicatorEnabled(false) 后向上箭头不显示

java - 如何使用 achartengine 在 android 中创建条形图以及动态值和静态值

android - 上传图片到服务器使用base64编码android

android - 当按下 RecyclerView 内的按钮时如何下载文件?

java - 在 Kotlin 中导入 org.apache.net.*

android - 如何加快 android studio 中的 Espresso 运行过程?

android - 使用 kotlin for android 应用程序将 pdf 文件上传到 firebase 存储

android - 重叠两个 Box jetpack 组合

android - 如何从jetpack compose中的惰性列中删除项目

android-jetpack-compose - 具有 View 绑定(bind)的 ComposeView