我有一个屏幕可以从图库中选择照片,在这个屏幕上,我从图库中选择照片并将我选择的 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
如您所见,它们彼此不同。所以图像不显示。当我从图库中选择图像时,我在屏幕上看不到图像。我无法解决的问题是什么?
正如我所见,您面临的问题是 viewModel 中的 uri 已编码,
":" -> "%3A"
。当您将“imageUri”直接放入导航路线时,它会进行 URL 编码。
所以使用前请尝试解码。
val capturedImage = savedStateHandle.get<String>(CNPHOTO)?.let { URLDecoder.decode(it, "UTF-8") }