如何使用 jetpack 撰写导航将位图从一个屏幕传递到另一个屏幕

Moh*_*mad 5 android android-jetpack-navigation android-jetpack-compose

我正在使用jetpack compose。我有两个屏幕,我想将位图从第一个屏幕发送到第二个屏幕。因此,我将位图转换为字符串并将其作为参数传递:


                            composable(
                                route = "${NavGraph.FilterScreen.route}/{screenShot}",
                                arguments = listOf(navArgument("screenShot") {
                                    this.type = NavType.StringType
                                })
                            ) {
                                FilterScreen(
                                    innerPadding = padding,
                                    navController = navController,
                                    screenShot = it.arguments?.getString("screenShot")
                                )
                            }
Run Code Online (Sandbox Code Playgroud)

我从第一个屏幕导航到第二个屏幕,如下所示:

 navController.navigate(NavGraph.FilterScreen.route + "/${bitmapToString(it)}")
Run Code Online (Sandbox Code Playgroud)

问题是:

看来是因为 Bitmap 的字符串版本太长,导航无法处理它并给出以下错误:

cannot be found in the navigation graph NavGraph(0x0) startDestination={Destination(0x78d845ec) route=home}
Run Code Online (Sandbox Code Playgroud)

我这么说是因为当我用包含位图值的字符串替换一个小的随机字符串时,一切都有效。

我也尝试过使用parcellable。但我收到错误,parcellable 不能有默认值,所以我们必须作为字符串传递。我该如何解决这个问题?

Mah*_*esh 0

您可以将图像保存在第一个屏幕上的临时文件中,然后在第二个屏幕上读取该图像,然后可以删除该文件。我在Github上做了一个示例项目,它可能不是最好的代码,但你明白了

第一个屏幕:

 val context = LocalContext.current
 val path = context.getExternalFilesDir(null)!!.absolutePath

 val image = YOUR_BITMAP_IMAGE

 val tempFile = File(path , "tempFileName.jpg")
 val fOut = FileOutputStream(tempFile)
 image.compress(Bitmap.CompressFormat.JPEG , 100 , fOut)
 fOut.close()

 goToNextScreen()
Run Code Online (Sandbox Code Playgroud)

第二个屏幕:

val context = LocalContext.current

val path = context.getExternalFilesDir(null)!!.absolutePath
val imagePath = "$path/tempFileName.jpg"

val image = BitmapFactory.decodeFile(imagePath)
File(imagePath).deleteOnExit() // Delete temp image
Run Code Online (Sandbox Code Playgroud)

它可能不是最好的解决方案,但它可以完成工作。