You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose导航如何传递列表参数?解决无ListType的问题

在Jetpack Compose导航中传递列表参数的解决方案

Jetpack Navigation本身没有内置的ListType,要传递列表(包括空列表),可以通过序列化列表为字符串或者自定义NavType两种方式实现,以下是具体步骤:

方法一:通过序列化字符串传递(推荐)

利用Gson或Kotlinx Serialization将列表转为JSON字符串,以StringType传递,接收时再解析回列表。

步骤1:准备序列化工具

如果用Gson,先添加依赖(若未引入):

implementation 'com.google.code.gson:gson:2.10.1'

假设列表元素是Employee数据类:

data class Employee(val id: Int, val name: String)

步骤2:修改路由与导航参数

更新Screen密封类的路由,添加参数占位符:

sealed class Screen(val route: String) {
    object HomeScreen : Screen("home?empList={empList}")
    object EmloyeeListScreen : Screen("employee-list?empList={empList}")
    // 其他页面路由同理修改
}

修改Navigation函数的composable配置:

fun Navigation(navController: NavHostController) {
    val gson = Gson()

    NavHost(navController = navController, startDestination = Screen.HomeScreen.route) {
        composable(
            Screen.HomeScreen.route,
            arguments = listOf(
                navArgument("empList") {
                    type = NavType.StringType
                    // 默认值设为空列表的JSON字符串
                    defaultValue = gson.toJson(emptyList<Employee>())
                }
            )
        ) { backStackEntry ->
            // 解析参数为列表
            val empListJson = backStackEntry.arguments?.getString("empList") ?: ""
            val empList = gson.fromJson(empListJson, object : TypeToken<List<Employee>>() {}.type)
            HomeScreen(navController, empList)
        }

        composable(
            Screen.EmloyeeListScreen.route,
            arguments = listOf(
                navArgument("empList") {
                    type = NavType.StringType
                    defaultValue = gson.toJson(emptyList<Employee>())
                }
            )
        ) { backStackEntry ->
            val empListJson = backStackEntry.arguments?.getString("empList") ?: ""
            val empList = gson.fromJson(empListJson, object : TypeToken<List<Employee>>() {}.type)
            EmployeeList(navController, empList)
        }

        // 其余页面按同样逻辑配置...
    }
}

步骤3:跳转时传递列表

跳转页面时将列表序列化为字符串替换路由占位符:

// 示例:从HomeScreen跳转到EmployeeListScreen
navController.navigate(
    Screen.EmloyeeListScreen.route.replace(
        "{empList}",
        gson.toJson(yourEmployeeList)
    )
)

方法二:自定义NavType

如果不想用字符串序列化,可以自定义NavType直接处理列表:

步骤1:实现自定义NavType

class EmployeeListNavType : NavType<List<Employee>>(isNullableAllowed = false) {
    private val gson = Gson()

    override fun getType(): String = "employee_list"

    override fun parseValue(value: String): List<Employee> {
        return gson.fromJson(value, object : TypeToken<List<Employee>>() {}.type)
    }

    override fun serializeValue(value: List<Employee>): String {
        return gson.toJson(value)
    }
}

步骤2:在导航中使用自定义NavType

composable(
    Screen.HomeScreen.route,
    arguments = listOf(
        navArgument("empList") {
            type = EmployeeListNavType()
            defaultValue = emptyList<Employee>()
        }
    )
) { backStackEntry ->
    val empList = backStackEntry.arguments?.get("empList") as List<Employee>
    HomeScreen(navController, empList)
}

注意事项

  • 若数据类实现了Parcelable,也可使用NavType.ParcelableArrayType传递ArrayList<Parcelable>,但需注意默认值设为空ArrayList。
  • 传递空列表时,确保默认值配置正确,避免解析异常。

内容的提问来源于stack exchange,提问作者Aswin Gopinathan 2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:15:34