Разница между объявлениями изменяемого состояния

Из Документов ,

Есть три способа объявить объект MutableState в компонуемом объекте:

  • val mutableState = запомнить {mutableStateOf(по умолчанию)}
  • значение var по запоминанию {mutableStateOf(по умолчанию)}
  • val (значение, setValue) = запомнить {mutableStateOf(по умолчанию)}

Эти объявления эквивалентны и предоставляются как синтаксический сахар для различных вариантов использования состояния. Вы должны выбрать тот, который создает наиболее простой для чтения код в компонуемом файле, который вы пишете.

Я использую их при тестировании пользовательского интерфейса.
Тест проходит успешно с одним типом объявления, но не работает с другим.

Код

      @ExperimentalMaterialApi
@Test
fun barcodeCreationCompleteFlow() {
    // Option 1 - This is NOT working
    // val (barcodeName, updateBarcodeName) = mutableStateOf("")

    // Option 2 - This is working, Why?
    var barcodeName by mutableStateOf("")
    val updateBarcodeName = { updatedBarcodeName: String ->
        barcodeName = updatedBarcodeName
    }

    var barcodeValue by mutableStateOf("")
    val updateBarcodeValue = { updatedBarcodeValue: String ->
        barcodeValue = updatedBarcodeValue
    }

    
    composeTestRule.setContent {
        MyAppTheme {
            CreateBarcodeScreenView(
                data = CreateBarcodeScreenViewData(
                    actionUpdateBarcodeValue = {
                        updateBarcodeValue(it)
                    },
                    actionUpdateBarcodeName = {
                        updateBarcodeName(it)
                    },
                    actionCreateBarcode = {},
                    barcodeValue = barcodeValue,
                    barcodeName = barcodeName,
                    barcodeValueEnabled = true,
                )
            )
        }
    }

    composeTestRule.onNodeWithText(
        text = "Barcode Name",
    ).performTextInput("test")
    composeTestRule.onRoot().printToLog("currentLabelExists")
    composeTestRule
        .onNodeWithText(defaultBarcodeNameInputText)
        .assertIsDisplayed()
}

Отладка показывает значение barcodeName не обновляется должным образом при использовании кода варианта 1.

Примечание: не используется remember так как это находится в тестировании композиции.

0 ответов

Другие вопросы по тегам