我一直在寻找Android architechture组件,最近一直在寻找Navigation组件。
我试图将一个对象作为参数传递,以便下一个片段可以检索该数据,但是要这样做,我需要做以下两件事之一:
关于这些选项的事情是,我读到Parcelable利用了反射功能,并且在时间上会变得非常昂贵
我也曾尝试构建一个“ SharedMasterDetailsViewModel”,但是由于在新创建的Fragment上未执行可观察到的回调,因此运气不佳。 (我认为LiveData在创建片段之前会执行回调)
以下是一些有关我如何尝试实现此目标的代码
SharedSessionViewModel
class SessionSharedViewModel : ViewModel() {
var sharedSession: LiveData<Session> = MutableLiveData()
private set
fun setSession(data: Session) {
val casted = this.sharedSession as MutableLiveData<Session>
casted.postValue(data)
}
}
MasterFragment
override fun onItemClicked(item: Session) {
sessionSharedViewModel.setSession(item) // Item is a complex object of mine
this@HomeFragment.findNavController().navigate(R.id.sessionDetailsFragment)
}
DetailsFragment
class SessionDetailsFragment : Fragment() {
companion object {
fun newInstance() = SessionDetailsFragment()
}
private lateinit var sharedViewModel: SessionSharedViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.session_details_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
Log.d("SESSIONDETAILS","created!")
super.onActivityCreated(savedInstanceState)
sharedViewModel = ViewModelProviders.of(this).get(SessionSharedViewModel::class.java)
sharedViewModel.sharedSession.observe({this.lifecycle},{ handleUI(it!!)})
}
fun handleUI(sharedSession: Session) {
Toast.makeText(activity, "This is inside new activity: ${sharedSession.title()}", Toast.LENGTH_SHORT)
}
}
我最后的希望是将我的对象序列化为一个JSON字符串,并在我的Detail片段的onCreateActivity lyfecycle钩子上重新解析该对象,但是我觉得那不是正确的解决方案。
在最坏的情况下,我只是传递对象的ID并从网络中重新获取它,但由于我已经有了想要显示的信息,因此我希望将其作为参数传递。
答案 0 :(得分:2)
你不能。
第一件事;以下语句
关于这些选项的事情是,我读到Parcelable利用了反射功能,并且在时间上会变得非常昂贵。
自从实现Parcelable
以来,您只提供了有关如何使用基本原始类型进行序列化和反序列化的方法:IE:writeBytes
,readBytes
,readInt
,{{ 1}}。
writeInt
不使用反射。 Parcelable
做到了!
虽然确实如此,但您被迫使用Serializable
喷射大脑开发了一个非常有用的注释,从而免除了必须编写名为Parcelable
的可打包实现的痛苦。
样品用量:
@Parcelize
现在,您可以传递类的实例而无需编写@Parcelize
data class User(val username: String, val password: String) : Parcelable
实现的一行。
更多信息here