从文档中,
在可组合对象中声明 MutableState 对象有三种方式:
- val mutableState = 记住 { mutableStateOf(default) }
- var 值记住 { mutableStateOf(default) }
- val (value, setValue) = 记住 { mutableStateOf(default) }
这些声明是等价的,并作为语法糖提供给状态的不同用途。您应该选择在您正在编写的可组合物中产生最容易阅读的代码的那个。
我在撰写 UI 测试中使用这些。
测试以一种类型的声明成功,但以另一种声明失败。
代码
@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
,因为这是在撰写测试中。