当我作为参数传递到 jetpack compose 中的另一个屏幕时,为什么我的 imageUri 会发生变化?

问题描述 投票:0回答:1

我有一个屏幕可以从图库中选择照片,在这个屏幕上,我从图库中选择照片并将我选择的 imageUri 传输到我想要显示的屏幕。所以,我们可以把它看作是上一个屏幕,但是我选择的imageUri和我传递的imageUri是有区别的。我的代码如下

这是我从图库屏幕中选择的图像

@Composable
fun CNChooseImageScreen(
    navHostController: NavHostController
) {

    var imageUri by remember { mutableStateOf<Uri>(Uri.EMPTY) }

    val launcher = rememberLauncherForActivityResult(contract = ActivityResultContracts.GetContent()
    ) { uri: Uri? ->

        if (uri != null) {
            imageUri = uri
        }else{
            //if occurs error
            navHostController.navigate(HealthScreen.HealthCreateNutritionScreen.route)
        }
    }

    LaunchedEffect(Unit) {
        launcher.launch("image/*")
    }

    var doOnce by remember{ mutableStateOf(true) }

    if (imageUri.path?.isNotEmpty() == true && doOnce) {

        println("choose "+imageUri)
        navHostController.navigate("${HealthScreen.HealthCreateNutritionScreen.route}?$CNPHOTO=$imageUri ")

        doOnce = false
    }
}

创建营养路线视图模型

我收到了我在要显示的屏幕的视图模型中发送的图像 Url。

init {
        val capturedImage = savedStateHandle.get<String>(CNPHOTO)
        println("viewmodel->"+capturedImage)
        if(capturedImage != null && capturedImage.isNotEmpty())
            _state.update {
                it.copy(
                    image = capturedImage
                )
            }
    }

这是我的导航图

composable(
            route = "${HealthScreen.HealthCreateNutritionScreen.route}?$CNPHOTO={$CNPHOTO}",
            arguments = listOf(
                navArgument(name = CNPHOTO) {
                    type = NavType.StringType
                    defaultValue = ""
                })
        ) {
       
            CreateNutritionRoute(navHostController = navHostController)
        }

这发生了

choose content://com.android.providers.media.documents/document/image%3A54 

viewmodel->content://com.android.providers.media.documents/document/image:54

如您所见,它们彼此不同。所以图像不显示。当我从图库中选择图像时,我在屏幕上看不到图像。我无法解决的问题是什么?

kotlin android-jetpack-compose image-gallery android-navigation android-gallery
1个回答
0
投票

正如我所见,您面临的问题是 viewModel 中的 uri 已编码,

":" -> "%3A"
。当您将“imageUri”直接放入导航路线时,它会进行 URL 编码。 所以使用前请尝试解码。

val capturedImage = savedStateHandle.get<String>(CNPHOTO)?.let { URLDecoder.decode(it, "UTF-8") }
© www.soinside.com 2019 - 2024. All rights reserved.