为什么我的可组合对象在更改HashMap中MutableState的值时未重新组合。
检视模型
val imageList: MutableState<HashMap<Int, Uri>> = mutableStateOf(HashMap())
fun setImage(imageUri: Uri) {
imageList.value[imagePosition] = imageUri
}
片段
if (viewModel.imageList.value[stepNo] != null && !TextUtils.isEmpty(
viewModel.imageList.value[stepNo].toString()
)
) {
Image(
contentDescription = "Recipe",
painter = painterResource(R.drawable.ic_baseline_fastfood_24),
modifier = Modifier
.padding(8.dp)
)
}
fun permissionCallbacks() {
imagePickerListener =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
// There are no request codes
val data: Intent? = result.data
val selectedImageUri = data?.data
selectedImageUri?.let { viewModel.setImage(it) }
}
}
requestPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
val galleryIntent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)
galleryIntent.type = "image/*"
imagePickerListener?.launch(galleryIntent)
} else {
}
}
}
通过调试,我发现在setImage()
方法内正确设置了值,但是在hashmap值更改时,没有再次调用viewModel.imageList.value[stepNo]
条件
3条答案
按热度按时间kqhtkvqz1#
mutableStateOf
只能在您将一个值替换为另一个值时进行跟踪。如果您更改当前值的状态,它将无法处理可以使用
mutableStateMapOf
代替mutableStateOf(HashMap())
:nr9pn0ug2#
好的,首先,你使用的初始化逻辑包含了样板。我的意思是,如果你写
val a = 0
,那么它是好的。你不需要在这里指定类型。val a : Int = 0
是错误的(实际上,不是技术上)。在你的初始化中,你不需要包括MutableState<...>
;您可以在mutableStateOf(...)
中的HashMap()
调用中指定哈希Map的类型。好的,其次,你不能把任何类型的数据当作状态(我的意思是compose不能),你可以试着用原始类型作为你的存储,或者检查是否存在一个完全符合你需要的类型,它是Compose中预先构建的。
例如,
val a by mutableStateOf("Hello")
将触发重新组合,而
val a by mutableStateOf(Path())
这是因为
Path()
在Compose中并不是状态持有者。如果实际上用Int和Uri的两个列表替换Int和Uri的Map,它将按预期工作,因为甚至支持不可变的
listOf()
。现在,你还可以搜索一个特定的预定义保持器是否支持你的用例,在这个例子中,就像有一个
mutableStateListOf()
被添加到库中,允许你直接将列表作为一个常规的列表对象使用,同时仍然是一个状态持有者。Philip说有mutableStateMapOf(),我还没有听说过,但是既然有
mutableStateListOf()
,它可能也在那里。所以,对于您的用例,如果它存在,它将正常工作,但您应该知道为什么HashMap不工作,这就是为什么我张贴的解释。
sdnqo3pr3#
使用
SnapshotStateMap
而不是HashMap: