kotlin 为什么我的可组合函数不能在HashMap的MutableState的值发生变化时重新组合?

nfeuvbwi  于 2022-11-16  发布在  Kotlin
关注(0)|答案(3)|浏览(200)

为什么我的可组合对象在更改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]条件

kqhtkvqz

kqhtkvqz1#

mutableStateOf只能在您将一个值替换为另一个值时进行跟踪。如果您更改当前值的状态,它将无法处理
可以使用mutableStateMapOf代替mutableStateOf(HashMap())

val imageList = mutableStateMapOf<Int, Uri>()
---
fun setImage(imageUri: Uri) {
    imageList[imagePosition] = imageUri
}
nr9pn0ug

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不工作,这就是为什么我张贴的解释。

sdnqo3pr

sdnqo3pr3#

使用SnapshotStateMap而不是HashMap:

相关问题