使用Navigation Component传递Twitter SDK User列表遇Parcelable错误求助
嘿,这个问题我之前也碰到过!核心问题出在Navigation Component对参数类型的处理上——你配置的com.twitter.sdk.android.core.models.User[]会让生成的代码默认用Parcelable数组来传递,但Twitter的User类只实现了Serializable,并没有实现Parcelable,所以putParcelableArray这行代码自然就报错了。
给你两个可行的解决方案,你可以根据自己的需求选:
方案一:直接改用Serializable数组传递
既然User本身是Serializable的,我们只需要在navigation.xml里把参数类型改成Serializable数组就行:
<argument android:name="list" app:argType="java.io.Serializable[]" />
你在Home Fragment里的跳转代码不用改,还是保持list.toTypedArray()的方式传递。
到了Detail Fragment,获取参数的时候只需要做个类型转换再转成List:
val args = DetailFragmentArgs.fromBundle(requireArguments()) val nonFollowersList = (args.list as Array<User>).toList()
方案二:封装成Serializable容器类(更优雅)
如果觉得直接转数组+类型转换有点别扭,可以自己写一个简单的容器类来装这个列表,同样实现Serializable:
// 放在你的项目包下,比如com.yourapp.models data class UserListWrapper(val users: List<User>) : Serializable
然后修改navigation.xml里的参数配置:
<argument android:name="userListWrapper" app:argType="com.yourapp.models.UserListWrapper" />
Home Fragment跳转时,把列表包装一下再传递:
val wrapper = UserListWrapper(nonFollowersList) val action = HomeFragmentDirections.actionHomeFragmentToDetailFragment(wrapper) requireView().findNavController().navigate(action)
Detail Fragment里直接拿到容器类再取列表:
val args = DetailFragmentArgs.fromBundle(requireArguments()) val nonFollowersList = args.userListWrapper.users
小提醒
Serializable的序列化效率确实比Parcelable低一些,但如果你的非关注者列表不是特别庞大(比如几千条那种),完全不用担心性能问题——毕竟Twitter的User类本身就已经支持Serializable了,不用我们额外做任何适配。
内容的提问来源于stack exchange,提问作者hanifedev
相关产品推荐
相关产品推荐

