Som*_*boy 5 navigation android kotlin android-livedata android-architecture-components
我一直在寻找 Android 架构组件,最近又在寻找导航组件。
我试图将对象作为参数传递,以便下一个片段可以检索该数据,但要做到这一点,我需要执行以下两件事之一:
关于这些选项的问题是,我读到 Parcelable 使用反射,并且它在时间方面可能会变得相当昂贵
我还尝试构建一个“SharedMasterDetailsViewModel”,但没有运气,因为可观察的回调没有在我新创建的片段上执行。(我认为 LiveData 在创建片段之前执行回调)
这是一些关于我如何尝试解决此问题的代码
共享会话视图模型
class SessionSharedViewModel : ViewModel() {
var sharedSession: LiveData<Session> = MutableLiveData()
private set
fun setSession(data: Session) {
val casted = this.sharedSession as MutableLiveData<Session>
casted.postValue(data)
}
}
Run Code Online (Sandbox Code Playgroud)
主片段
override fun onItemClicked(item: Session) {
sessionSharedViewModel.setSession(item) // Item is a complex object of mine
this@HomeFragment.findNavController().navigate(R.id.sessionDetailsFragment)
}
Run Code Online (Sandbox Code Playgroud)
详情片段
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我最后的希望是将我的对象序列化为 JSON 字符串,并在详细信息片段的 onCreateActivity lyfecycle 挂钩上重新解析该对象,但我觉得这不是正确的解决方案。
在最坏的情况下,我只会传递对象的 id 并从网络重新获取它,但由于我已经有了我想要显示的信息,所以我想将它作为参数传递。
你不能。
第一件事;以下声明
关于这些选项的问题是,我读到 Parcelable 使用反射,并且它可能会在时间方面变得相当昂贵。
由于您实现了,所以Parcelable
您只是提供有关如何使用基本基元类型进行序列化和反序列化的方法:IE: writeBytes
, readBytes
, readInt
, writeInt
。
Parcelable
不使用反射。Serializable
做!
虽然您确实被迫使用Parcelable
jet Brains 开发了一个非常有用的注释,它消除了必须编写名为 的可分割实现的痛苦@Parcelize
。
使用示例:
@Parcelize
data class User(val username: String, val password: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)
现在您可以传递类的实例,而无需编写一行Parcelable
实现。
更多信息请点击此处
归档时间: |
|
查看次数: |
5177 次 |
最近记录: |