Разница между объявлениями изменяемого состояния
Из Документов ,
Есть три способа объявить объект 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
так как это находится в тестировании композиции.