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

np8igboo  于 2023-04-04  发布在  Android
关注(0)|答案(1)|浏览(112)

我将描述我的问题,然后我将提供我的实现。我有一个viewModel,其中包含一个变量connectionStatus,该变量存储跟踪“设备”的connectionStatus的值,并在设备的连接状态更改时更改。
我在一个Text composable中显示连接状态。在文本composable下面,我还有一个按钮“cancel connection”,它调用viewModel中的cancelConnection方法。

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

现在,我认为问题是connectionState导致整个viewModel的状态发生了变化,因为当我删除Text组合,只留下按钮组合时,每次connectionStatus发生变化时,它仍然会重新组合。
这是我的实现:视图模型:

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()
    }
}

现在在我的composables中,我有这样的东西:

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

为什么每次connectionStatus被改变时CustomButton都被重新组合?即使我传递的是方法引用。

arknldoa

arknldoa1#

试试看:

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

相关问题